diff --git a/mobly/base_test.py b/mobly/base_test.py
index 76dbf8e..b499fc5 100644
--- a/mobly/base_test.py
+++ b/mobly/base_test.py
@@ -69,9 +69,6 @@
             the execution of tests.
         controller_configs: dict, controller configs provided by the user via
             test bed config.
-        current_test_name: [Deprecated, use `self.current_test_info.name`]
-            A string that's the name of the test method currently being
-            executed. If no test is executing, this should be None.
         current_test_info: RuntimeTestInfo, runtime information on the test
             currently being executed.
         log_path: string, specifies the root directory for all logs written
@@ -107,8 +104,6 @@
         self.user_params = configs.user_params
         self.results = records.TestResult()
         self.summary_writer = configs.summary_writer
-        # Deprecated, use `self.current_test_info.name`.
-        self.current_test_name = None
         self._generated_test_table = collections.OrderedDict()
         self._controller_manager = controller_manager.ControllerManager(
             class_name=self.TAG, controller_configs=configs.controller_configs)
@@ -409,7 +404,6 @@
         """Proxy function to guarantee the base implementation of setup_test is
         called.
         """
-        self.current_test_name = test_name
         with self._log_test_stage(STAGE_NAME_SETUP_TEST):
             self.setup_test()
 
@@ -535,7 +529,7 @@
             except Exception as e:
                 logging.exception(
                     'Exception happened when executing %s for %s.',
-                    procedure_name, self.current_test_name)
+                    procedure_name, self.current_test_info.name)
                 tr_record.add_error(procedure_name, e)
 
     def record_data(self, content):
@@ -590,7 +584,7 @@
                 raise
             except Exception:
                 logging.exception('Exception occurred in %s.',
-                                  self.current_test_name)
+                                  self.current_test_info.name)
                 raise
             finally:
                 before_count = expects.recorder.error_count
@@ -648,7 +642,6 @@
                 self.summary_writer.dump(tr_record.to_dict(),
                                          records.TestSummaryEntryType.RECORD)
                 self.current_test_info = None
-                self.current_test_name = None
 
     def _assert_function_name_in_stack(self, expected_func_name):
         """Asserts that the current stack contains the given function name."""
diff --git a/mobly/controllers/android_device.py b/mobly/controllers/android_device.py
index cf3a996..0ac605a 100644
--- a/mobly/controllers/android_device.py
+++ b/mobly/controllers/android_device.py
@@ -173,15 +173,6 @@
                                  'services failed to start.')
 
 
-def _parse_device_list(device_list_str, key):
-    """Parses a byte string representing a list of devices.
-
-    Deprecated, use `parse_device_list(device_list_str, key)` instead.
-    This method will be removed in 1.9.
-    """
-    return parse_device_list(device_list_str, key)
-
-
 def parse_device_list(device_list_str, key):
     """Parses a byte string representing a list of devices.
 
@@ -366,9 +357,6 @@
     """Finds a unique AndroidDevice instance from a list that has specific
     attributes of certain values.
 
-    Deprecated, use `get_devices(ads, **kwargs)[0]` instead.
-    This method will be removed in 1.8.
-
     Example:
         get_device(android_devices, label='foo', phone_number='1234567890')
         get_device(android_devices, model='angler')
diff --git a/mobly/logger.py b/mobly/logger.py
index 006f6d9..b3a0fb7 100644
--- a/mobly/logger.py
+++ b/mobly/logger.py
@@ -344,7 +344,7 @@
 def normalize_log_line_timestamp(log_line_timestamp):
     """Replace special characters in log line timestamp with normal characters.
 
-    .. deprecated:: 1.9.2
+    .. deprecated:: 1.10
 
         This method is obsolete with the more general `sanitize_filename` method
         and is only kept for backwards compatibility. In a future update, this
diff --git a/tests/mobly/base_test_test.py b/tests/mobly/base_test_test.py
index 2cb3bb0..aa4917b 100755
--- a/tests/mobly/base_test_test.py
+++ b/tests/mobly/base_test_test.py
@@ -67,10 +67,10 @@
     def test_current_test_name(self):
         class MockBaseTest(base_test.BaseTestClass):
             def test_func(self):
-                asserts.assert_true(
-                    self.current_test_name == "test_func",
-                    ("Got "
-                     "unexpected test name %s.") % self.current_test_name)
+                asserts.assert_true(self.current_test_info.name == "test_func",
+                                    ("Got "
+                                     "unexpected test name %s.") %
+                                    self.current_test_info.name)
 
         bt_cls = MockBaseTest(self.mock_test_cls_configs)
         bt_cls.run(test_names=["test_func"])
@@ -82,12 +82,13 @@
     def test_current_test_info(self):
         class MockBaseTest(base_test.BaseTestClass):
             def test_func(self):
-                asserts.assert_true(self.current_test_info.name == 'test_func',
-                                    'Got unexpected test name %s.' %
-                                    self.current_test_info.name)
-                output_path = self.current_test_info.output_path
                 asserts.assert_true(
-                    os.path.exists(output_path), 'test output path missing')
+                    self.current_test_info.name == 'test_func',
+                    'Got unexpected test name %s.' %
+                    self.current_test_info.name)
+                output_path = self.current_test_info.output_path
+                asserts.assert_true(os.path.exists(output_path),
+                                    'test output path missing')
 
         bt_cls = MockBaseTest(self.mock_test_cls_configs)
         bt_cls.run(test_names=['test_func'])
@@ -104,8 +105,8 @@
                     'Got unexpected test name %s.' %
                     self.current_test_info.name)
                 output_path = self.current_test_info.output_path
-                asserts.assert_true(
-                    os.path.exists(output_path), 'test output path missing')
+                asserts.assert_true(os.path.exists(output_path),
+                                    'test output path missing')
                 raise Exception(MSG_EXPECTED_EXCEPTION)
 
         bt_cls = MockBaseTest(self.mock_test_cls_configs)
@@ -529,7 +530,7 @@
 
         class MockBaseTest(base_test.BaseTestClass):
             def on_fail(self, record):
-                assert self.current_test_name == 'test_something'
+                assert self.current_test_info.name == 'test_something'
                 my_mock("on_fail")
 
             def on_pass(self, record):
@@ -840,8 +841,8 @@
                 raise Exception(MSG_EXPECTED_EXCEPTION)
 
             def test_something(self):
-                asserts.explicit_pass(
-                    MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
+                asserts.explicit_pass(MSG_EXPECTED_EXCEPTION,
+                                      extras=MOCK_EXTRA)
 
         bt_cls = MockBaseTest(self.mock_test_cls_configs)
         bt_cls.run()
@@ -1161,8 +1162,9 @@
     def test_assert_true(self):
         class MockBaseTest(base_test.BaseTestClass):
             def test_func(self):
-                asserts.assert_true(
-                    False, MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
+                asserts.assert_true(False,
+                                    MSG_EXPECTED_EXCEPTION,
+                                    extras=MOCK_EXTRA)
                 never_call()
 
         bt_cls = MockBaseTest(self.mock_test_cls_configs)
@@ -1199,8 +1201,10 @@
     def test_assert_equal_fail_with_msg(self):
         class MockBaseTest(base_test.BaseTestClass):
             def test_func(self):
-                asserts.assert_equal(
-                    1, 2, msg=MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
+                asserts.assert_equal(1,
+                                     2,
+                                     msg=MSG_EXPECTED_EXCEPTION,
+                                     extras=MOCK_EXTRA)
 
         bt_cls = MockBaseTest(self.mock_test_cls_configs)
         bt_cls.run()
@@ -1320,8 +1324,8 @@
     def test_explicit_pass(self):
         class MockBaseTest(base_test.BaseTestClass):
             def test_func(self):
-                asserts.explicit_pass(
-                    MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
+                asserts.explicit_pass(MSG_EXPECTED_EXCEPTION,
+                                      extras=MOCK_EXTRA)
                 never_call()
 
         bt_cls = MockBaseTest(self.mock_test_cls_configs)
@@ -1362,8 +1366,9 @@
         class MockBaseTest(base_test.BaseTestClass):
             def test_func(self):
                 asserts.skip_if(False, MSG_UNEXPECTED_EXCEPTION)
-                asserts.skip_if(
-                    True, MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
+                asserts.skip_if(True,
+                                MSG_EXPECTED_EXCEPTION,
+                                extras=MOCK_EXTRA)
                 never_call()
 
         bt_cls = MockBaseTest(self.mock_test_cls_configs)
@@ -1398,8 +1403,9 @@
 
         class MockBaseTest(base_test.BaseTestClass):
             def test_func(self):
-                expects.expect_true(
-                    False, MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
+                expects.expect_true(False,
+                                    MSG_EXPECTED_EXCEPTION,
+                                    extras=MOCK_EXTRA)
                 must_call('ha')
 
             def on_fail(self, record):
@@ -1447,8 +1453,9 @@
 
         class MockBaseTest(base_test.BaseTestClass):
             def test_1(self):
-                expects.expect_true(
-                    False, MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
+                expects.expect_true(False,
+                                    MSG_EXPECTED_EXCEPTION,
+                                    extras=MOCK_EXTRA)
                 must_call('ha')
 
             def test_2(self):
@@ -1471,13 +1478,15 @@
 
         class MockBaseTest(base_test.BaseTestClass):
             def test_1(self):
-                expects.expect_true(
-                    True, MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
+                expects.expect_true(True,
+                                    MSG_EXPECTED_EXCEPTION,
+                                    extras=MOCK_EXTRA)
                 must_call('ha')
 
             def test_2(self):
-                expects.expect_false(
-                    False, MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
+                expects.expect_false(False,
+                                     MSG_EXPECTED_EXCEPTION,
+                                     extras=MOCK_EXTRA)
                 must_call('ha')
 
         bt_cls = MockBaseTest(self.mock_test_cls_configs)
@@ -1492,8 +1501,9 @@
 
         class MockBaseTest(base_test.BaseTestClass):
             def setup_class(self):
-                expects.expect_true(
-                    False, MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
+                expects.expect_true(False,
+                                    MSG_EXPECTED_EXCEPTION,
+                                    extras=MOCK_EXTRA)
                 must_call('ha')
 
             def test_func(self):
@@ -1523,16 +1533,18 @@
 
         class MockBaseTest(base_test.BaseTestClass):
             def setup_class(self):
-                expects.expect_true(
-                    False, 'Failure in setup_class', extras=MOCK_EXTRA)
+                expects.expect_true(False,
+                                    'Failure in setup_class',
+                                    extras=MOCK_EXTRA)
                 must_call('ha')
 
             def test_func(self):
                 pass
 
             def on_fail(self, record):
-                expects.expect_true(
-                    False, 'Failure in on_fail', extras=MOCK_EXTRA)
+                expects.expect_true(False,
+                                    'Failure in on_fail',
+                                    extras=MOCK_EXTRA)
                 must_call2('on_fail')
 
         bt_cls = MockBaseTest(self.mock_test_cls_configs)
@@ -1552,8 +1564,8 @@
         self.assertIsNotNone(setup_class_dict['End Time'])
         self.assertEqual(setup_class_dict['Test Name'], 'setup_class')
         # Verify the on_fail error is recorded in summary result.
-        extra_error_dict = next(
-            iter(setup_class_dict['Extra Errors'].values()))
+        extra_error_dict = next(iter(
+            setup_class_dict['Extra Errors'].values()))
         self.assertEqual(extra_error_dict['Details'], 'Failure in on_fail')
 
     def test_expect_in_teardown_class(self):
@@ -1564,8 +1576,9 @@
                 pass
 
             def teardown_class(self):
-                expects.expect_true(
-                    False, MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
+                expects.expect_true(False,
+                                    MSG_EXPECTED_EXCEPTION,
+                                    extras=MOCK_EXTRA)
                 must_call('ha')
 
         bt_cls = MockBaseTest(self.mock_test_cls_configs)
@@ -1582,8 +1595,9 @@
 
         class MockBaseTest(base_test.BaseTestClass):
             def setup_test(self):
-                expects.expect_true(
-                    False, MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
+                expects.expect_true(False,
+                                    MSG_EXPECTED_EXCEPTION,
+                                    extras=MOCK_EXTRA)
                 must_call('ha')
 
             def test_func(self):
@@ -1610,8 +1624,9 @@
                 pass
 
             def teardown_test(self):
-                expects.expect_true(
-                    False, MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
+                expects.expect_true(False,
+                                    MSG_EXPECTED_EXCEPTION,
+                                    extras=MOCK_EXTRA)
                 must_call('ha')
 
             def on_fail(self, record):
@@ -1631,8 +1646,9 @@
 
         class MockBaseTest(base_test.BaseTestClass):
             def test_func(self):
-                expects.expect_false(
-                    True, MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
+                expects.expect_false(True,
+                                     MSG_EXPECTED_EXCEPTION,
+                                     extras=MOCK_EXTRA)
                 must_call('ha')
 
         bt_cls = MockBaseTest(self.mock_test_cls_configs)
@@ -1648,8 +1664,10 @@
 
         class MockBaseTest(base_test.BaseTestClass):
             def test_func(self):
-                expects.expect_equal(
-                    1, 2, MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
+                expects.expect_equal(1,
+                                     2,
+                                     MSG_EXPECTED_EXCEPTION,
+                                     extras=MOCK_EXTRA)
                 must_call('ha')
 
         bt_cls = MockBaseTest(self.mock_test_cls_configs)
@@ -1706,8 +1724,9 @@
 
         class MockBaseTest(base_test.BaseTestClass):
             def test_func(self):
-                expects.expect_true(
-                    False, MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
+                expects.expect_true(False,
+                                    MSG_EXPECTED_EXCEPTION,
+                                    extras=MOCK_EXTRA)
                 must_call('ha')
                 asserts.assert_true(False, 'failed from assert_true')
 
@@ -1770,8 +1789,8 @@
         thrown.
         """
         bc = base_test.BaseTestClass(self.mock_test_cls_configs)
-        bc.unpack_userparams(
-            req_param_names=['a_kwarg_param'], a_kwarg_param="whatever")
+        bc.unpack_userparams(req_param_names=['a_kwarg_param'],
+                             a_kwarg_param="whatever")
         self.assertEqual(bc.a_kwarg_param, "whatever")
 
     def test_unpack_userparams_optional_missing(self):
@@ -1788,8 +1807,8 @@
         configs.user_params["something"] = 42
         configs.user_params["something_else"] = 53
         bc = base_test.BaseTestClass(configs)
-        bc.unpack_userparams(
-            req_param_names=required, opt_param_names=optional)
+        bc.unpack_userparams(req_param_names=required,
+                             opt_param_names=optional)
         self.assertEqual(bc.something, 42)
         self.assertEqual(bc.something_else, 53)
 
@@ -1840,10 +1859,9 @@
     def test_generate_tests_run(self):
         class MockBaseTest(base_test.BaseTestClass):
             def setup_generated_tests(self):
-                self.generate_tests(
-                    test_logic=self.logic,
-                    name_func=self.name_gen,
-                    arg_sets=[(1, 2), (3, 4)])
+                self.generate_tests(test_logic=self.logic,
+                                    name_func=self.name_gen,
+                                    arg_sets=[(1, 2), (3, 4)])
 
             def name_gen(self, a, b):
                 return 'test_%s_%s' % (a, b)
@@ -1863,11 +1881,10 @@
     def test_generate_tests_with_uid(self):
         class MockBaseTest(base_test.BaseTestClass):
             def setup_generated_tests(self):
-                self.generate_tests(
-                    test_logic=self.logic,
-                    name_func=self.name_gen,
-                    uid_func=self.uid_logic,
-                    arg_sets=[(1, 2), (3, 4)])
+                self.generate_tests(test_logic=self.logic,
+                                    name_func=self.name_gen,
+                                    uid_func=self.uid_logic,
+                                    arg_sets=[(1, 2), (3, 4)])
 
             def name_gen(self, a, b):
                 return 'test_%s_%s' % (a, b)
@@ -1886,11 +1903,10 @@
     def test_generate_tests_with_none_uid(self):
         class MockBaseTest(base_test.BaseTestClass):
             def setup_generated_tests(self):
-                self.generate_tests(
-                    test_logic=self.logic,
-                    name_func=self.name_gen,
-                    uid_func=self.uid_logic,
-                    arg_sets=[(1, 2), (3, 4)])
+                self.generate_tests(test_logic=self.logic,
+                                    name_func=self.name_gen,
+                                    uid_func=self.uid_logic,
+                                    arg_sets=[(1, 2), (3, 4)])
 
             def name_gen(self, a, b):
                 return 'test_%s_%s' % (a, b)
@@ -1911,10 +1927,9 @@
     def test_generate_tests_selected_run(self):
         class MockBaseTest(base_test.BaseTestClass):
             def setup_generated_tests(self):
-                self.generate_tests(
-                    test_logic=self.logic,
-                    name_func=self.name_gen,
-                    arg_sets=[(1, 2), (3, 4)])
+                self.generate_tests(test_logic=self.logic,
+                                    name_func=self.name_gen,
+                                    arg_sets=[(1, 2), (3, 4)])
 
             def name_gen(self, a, b):
                 return 'test_%s_%s' % (a, b)
@@ -1931,10 +1946,9 @@
     def test_generate_tests_call_outside_of_setup_generated_tests(self):
         class MockBaseTest(base_test.BaseTestClass):
             def test_ha(self):
-                self.generate_tests(
-                    test_logic=self.logic,
-                    name_func=self.name_gen,
-                    arg_sets=[(1, 2), (3, 4)])
+                self.generate_tests(test_logic=self.logic,
+                                    name_func=self.name_gen,
+                                    arg_sets=[(1, 2), (3, 4)])
 
             def name_gen(self, a, b):
                 return 'test_%s_%s' % (a, b)
@@ -1958,10 +1972,9 @@
     def test_generate_tests_dup_test_name(self):
         class MockBaseTest(base_test.BaseTestClass):
             def setup_generated_tests(self):
-                self.generate_tests(
-                    test_logic=self.logic,
-                    name_func=self.name_gen,
-                    arg_sets=[(1, 2), (3, 4)])
+                self.generate_tests(test_logic=self.logic,
+                                    name_func=self.name_gen,
+                                    arg_sets=[(1, 2), (3, 4)])
 
             def name_gen(self, a, b):
                 return 'ha'
