diff --git a/audio_bluetooth_hw/utils_unittest.cc b/audio_bluetooth_hw/utils_unittest.cc
index a457797..665dea6 100644
--- a/audio_bluetooth_hw/utils_unittest.cc
+++ b/audio_bluetooth_hw/utils_unittest.cc
@@ -25,8 +25,8 @@
 
 class UtilsTest : public testing::Test {
  protected:
-  virtual void SetUp() {}
-  virtual void TearDown() { map_.clear(); }
+  void SetUp() override {}
+  void TearDown() override { map_.clear(); }
 
   std::unordered_map<std::string, std::string> map_;
 };
diff --git a/audio_hal_interface/client_interface.cc b/audio_hal_interface/client_interface.cc
index e6d6a6b..bf3d068 100644
--- a/audio_hal_interface/client_interface.cc
+++ b/audio_hal_interface/client_interface.cc
@@ -73,7 +73,7 @@
                          const android::sp<IBluetoothAudioProvider>& provider)
       : sink_(sink), provider_(provider){};
 
-  Return<void> startStream() {
+  Return<void> startStream() override {
     BluetoothAudioCtrlAck ack = sink_->StartRequest();
     if (ack != BluetoothAudioCtrlAck::PENDING) {
       auto hidl_retval =
@@ -85,7 +85,7 @@
     return Void();
   }
 
-  Return<void> suspendStream() {
+  Return<void> suspendStream() override {
     BluetoothAudioCtrlAck ack = sink_->SuspendRequest();
     if (ack != BluetoothAudioCtrlAck::PENDING) {
       auto hidl_retval =
@@ -97,12 +97,13 @@
     return Void();
   }
 
-  Return<void> stopStream() {
+  Return<void> stopStream() override {
     sink_->StopRequest();
     return Void();
   }
 
-  Return<void> getPresentationPosition(getPresentationPosition_cb _hidl_cb) {
+  Return<void> getPresentationPosition(
+      getPresentationPosition_cb _hidl_cb) override {
     uint64_t remote_delay_report_ns;
     uint64_t total_bytes_read;
     timespec data_position;
@@ -128,7 +129,7 @@
     return Void();
   }
 
-  Return<void> updateMetadata(const SourceMetadata& sourceMetadata) {
+  Return<void> updateMetadata(const SourceMetadata& sourceMetadata) override {
     LOG(INFO) << __func__ << ": " << sourceMetadata.tracks.size()
               << " track(s)";
     // refer to StreamOut.impl.h within Audio HAL (AUDIO_HAL_VERSION_5_0)
@@ -166,7 +167,8 @@
       : bluetooth_audio_clientif_(clientif), message_loop_(message_loop) {}
   void serviceDied(
       uint64_t /*cookie*/,
-      const ::android::wp<::android::hidl::base::V1_0::IBase>& /*who*/) {
+      const ::android::wp<::android::hidl::base::V1_0::IBase>& /*who*/)
+      override {
     LOG(WARNING) << __func__ << ": restarting connection with new Audio Hal";
     if (bluetooth_audio_clientif_ != nullptr && message_loop_ != nullptr) {
       // restart the session on the correct thread
diff --git a/audio_hal_interface/client_interface_unittest.cc b/audio_hal_interface/client_interface_unittest.cc
index de6ba52..fd8c8dc 100644
--- a/audio_hal_interface/client_interface_unittest.cc
+++ b/audio_hal_interface/client_interface_unittest.cc
@@ -65,16 +65,16 @@
  public:
   TestTransport(SessionType session_type)
       : bluetooth::audio::IBluetoothTransportInstance(session_type, {}){};
-  bluetooth::audio::BluetoothAudioCtrlAck StartRequest() {
+  bluetooth::audio::BluetoothAudioCtrlAck StartRequest() override {
     return bluetooth::audio::BluetoothAudioCtrlAck::SUCCESS_FINISHED;
   }
-  bluetooth::audio::BluetoothAudioCtrlAck SuspendRequest() {
+  bluetooth::audio::BluetoothAudioCtrlAck SuspendRequest() override {
     return bluetooth::audio::BluetoothAudioCtrlAck::SUCCESS_FINISHED;
   }
-  void StopRequest() {}
+  void StopRequest() override {}
   bool GetPresentationPosition(uint64_t* remote_delay_report_ns,
                                uint64_t* total_bytes_readed,
-                               timespec* data_position) {
+                               timespec* data_position) override {
     if (remote_delay_report_ns) {
       *remote_delay_report_ns = kRemoteDelayReportMs * 1000000;
     }
@@ -86,9 +86,10 @@
     }
     return true;
   }
-  void MetadataChanged(const source_metadata_t& source_metadata __unused) {}
-  void ResetPresentationPosition(){};
-  void LogBytesRead(size_t bytes_readed __unused){};
+  void MetadataChanged(
+      const source_metadata_t& source_metadata __unused) override {}
+  void ResetPresentationPosition() override{};
+  void LogBytesRead(size_t bytes_readed __unused) override{};
 };
 
 class BluetoothAudioClientInterfaceTest : public Test {
@@ -98,9 +99,9 @@
 
   static constexpr int kClientIfReturnSuccess = 0;
 
-  virtual void SetUp() override {}
+  void SetUp() override {}
 
-  virtual void TearDown() override {
+  void TearDown() override {
     clientif_ = nullptr;
     test_transport_ = nullptr;
   }
diff --git a/bta/hearing_aid/hearing_aid.cc b/bta/hearing_aid/hearing_aid.cc
index a83392c..14299e2 100644
--- a/bta/hearing_aid/hearing_aid.cc
+++ b/bta/hearing_aid/hearing_aid.cc
@@ -220,7 +220,7 @@
   bool audio_running;
 
  public:
-  virtual ~HearingAidImpl() = default;
+  ~HearingAidImpl() override = default;
 
   HearingAidImpl(bluetooth::hearing_aid::HearingAidCallbacks* callbacks,
                  Closure initCb)
diff --git a/btif/src/btif_a2dp_audio_interface.cc b/btif/src/btif_a2dp_audio_interface.cc
index 7e46818..026baa1 100644
--- a/btif/src/btif_a2dp_audio_interface.cc
+++ b/btif/src/btif_a2dp_audio_interface.cc
@@ -137,15 +137,15 @@
 
 class BluetoothAudioHost : public IBluetoothAudioHost {
  public:
-  Return<void> startStream() {
+  Return<void> startStream() override {
     btif_a2dp_audio_send_start_req();
     return Void();
   }
-  Return<void> suspendStream() {
+  Return<void> suspendStream() override {
     btif_a2dp_audio_send_suspend_req();
     return Void();
   }
-  Return<void> stopStream() {
+  Return<void> stopStream() override {
     btif_a2dp_audio_send_stop_req();
     return Void();
   }
@@ -160,9 +160,9 @@
 
 class BluetoothAudioDeathRecipient : public hidl_death_recipient {
  public:
-  virtual void serviceDied(
+  void serviceDied(
       uint64_t /*cookie*/,
-      const wp<::android::hidl::base::V1_0::IBase>& /*who*/) {
+      const wp<::android::hidl::base::V1_0::IBase>& /*who*/) override {
     LOG_ERROR(LOG_TAG, "%s", __func__);
     // Restart the session on the correct thread
     do_in_main_thread(FROM_HERE,
diff --git a/btif/src/btif_ble_advertiser.cc b/btif/src/btif_ble_advertiser.cc
index dcbe080..d1923bd 100644
--- a/btif/src/btif_ble_advertiser.cc
+++ b/btif/src/btif_ble_advertiser.cc
@@ -83,7 +83,7 @@
 }
 
 class BleAdvertiserInterfaceImpl : public BleAdvertiserInterface {
-  ~BleAdvertiserInterfaceImpl(){};
+  ~BleAdvertiserInterfaceImpl() override{};
 
   void RegisterAdvertiserCb(IdStatusCallback cb, uint8_t advertiser_id,
                             uint8_t status) {
diff --git a/btif/src/btif_ble_scanner.cc b/btif/src/btif_ble_scanner.cc
index fa6fd4c..b314993 100644
--- a/btif/src/btif_ble_scanner.cc
+++ b/btif/src/btif_ble_scanner.cc
@@ -203,7 +203,7 @@
 void bta_cback(tBTA_GATTC_EVT, tBTA_GATTC*) {}
 
 class BleScannerInterfaceImpl : public BleScannerInterface {
-  ~BleScannerInterfaceImpl(){};
+  ~BleScannerInterfaceImpl() override{};
 
   void RegisterScanner(RegisterCallback cb) override {
     do_in_main_thread(FROM_HERE,
diff --git a/btif/src/btif_hearing_aid.cc b/btif/src/btif_hearing_aid.cc
index efba57d..e248272 100644
--- a/btif/src/btif_hearing_aid.cc
+++ b/btif/src/btif_hearing_aid.cc
@@ -53,7 +53,7 @@
 class HearingAidInterfaceImpl
     : public bluetooth::hearing_aid::HearingAidInterface,
       public HearingAidCallbacks {
-  ~HearingAidInterfaceImpl() = default;
+  ~HearingAidInterfaceImpl() override = default;
 
   void Init(HearingAidCallbacks* callbacks) override {
     DVLOG(2) << __func__;
diff --git a/common/leaky_bonded_queue_unittest.cc b/common/leaky_bonded_queue_unittest.cc
index fcd55cd..b2ff35b 100644
--- a/common/leaky_bonded_queue_unittest.cc
+++ b/common/leaky_bonded_queue_unittest.cc
@@ -42,7 +42,7 @@
 class MockItem : public Item {
  public:
   MockItem(int i) : Item(i) {}
-  ~MockItem() { Destruct(); }
+  ~MockItem() override { Destruct(); }
   MOCK_METHOD0(Destruct, void());
 };
 
diff --git a/common/metrics_unittest.cc b/common/metrics_unittest.cc
index 03a427a..a46c896 100644
--- a/common/metrics_unittest.cc
+++ b/common/metrics_unittest.cc
@@ -400,12 +400,12 @@
     bt_log_->Clear();
   }
 
-  void SetUp() {
+  void SetUp() override {
     bt_log_ = new BluetoothLog();
     // Clear existing metrics entries, if any
     BluetoothMetricsLogger::GetInstance()->Reset();
   }
-  void TearDown() {
+  void TearDown() override {
     // Clear remaining metrics entries, if any
     BluetoothMetricsLogger::GetInstance()->Reset();
     ClearLog();
diff --git a/hci/src/hci_layer_android.cc b/hci/src/hci_layer_android.cc
index 92be0df..d3fa526 100644
--- a/hci/src/hci_layer_android.cc
+++ b/hci/src/hci_layer_android.cc
@@ -83,25 +83,25 @@
     return packet;
   }
 
-  Return<void> initializationComplete(Status status) {
+  Return<void> initializationComplete(Status status) override {
     CHECK(status == Status::SUCCESS);
     initialization_complete();
     return Void();
   }
 
-  Return<void> hciEventReceived(const hidl_vec<uint8_t>& event) {
+  Return<void> hciEventReceived(const hidl_vec<uint8_t>& event) override {
     BT_HDR* packet = WrapPacketAndCopy(MSG_HC_TO_STACK_HCI_EVT, event);
     hci_event_received(FROM_HERE, packet);
     return Void();
   }
 
-  Return<void> aclDataReceived(const hidl_vec<uint8_t>& data) {
+  Return<void> aclDataReceived(const hidl_vec<uint8_t>& data) override {
     BT_HDR* packet = WrapPacketAndCopy(MSG_HC_TO_STACK_HCI_ACL, data);
     acl_event_received(packet);
     return Void();
   }
 
-  Return<void> scoDataReceived(const hidl_vec<uint8_t>& data) {
+  Return<void> scoDataReceived(const hidl_vec<uint8_t>& data) override {
     BT_HDR* packet = WrapPacketAndCopy(MSG_HC_TO_STACK_HCI_SCO, data);
     sco_data_received(packet);
     return Void();
diff --git a/hci/test/packet_fragmenter_test.cc b/hci/test/packet_fragmenter_test.cc
index 483a66d..ca83dfa 100644
--- a/hci/test/packet_fragmenter_test.cc
+++ b/hci/test/packet_fragmenter_test.cc
@@ -291,7 +291,7 @@
 
 class PacketFragmenterTest : public AllocationTestHarness {
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     AllocationTestHarness::SetUp();
     fragmenter =
         packet_fragmenter_get_test_interface(&controller, &allocator_malloc);
@@ -309,7 +309,7 @@
     fragmenter->init(&callbacks);
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     fragmenter->cleanup();
     AllocationTestHarness::TearDown();
   }
diff --git a/osi/test/alarm_test.cc b/osi/test/alarm_test.cc
index 20fd7d6..dbd63a0 100644
--- a/osi/test/alarm_test.cc
+++ b/osi/test/alarm_test.cc
@@ -46,7 +46,7 @@
 
 class AlarmTest : public AlarmTestHarness {
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     AlarmTestHarness::SetUp();
     cb_counter = 0;
     cb_misordered_counter = 0;
@@ -54,7 +54,7 @@
     semaphore = semaphore_new(0);
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     semaphore_free(semaphore);
     AlarmTestHarness::TearDown();
   }
diff --git a/osi/test/config_test.cc b/osi/test/config_test.cc
index 58ce818..7c689c9 100644
--- a/osi/test/config_test.cc
+++ b/osi/test/config_test.cc
@@ -51,7 +51,7 @@
 
 class ConfigTest : public AllocationTestHarness {
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     AllocationTestHarness::SetUp();
     FILE* fp = fopen(CONFIG_FILE, "wt");
     fwrite(CONFIG_FILE_CONTENT, 1, sizeof(CONFIG_FILE_CONTENT), fp);
diff --git a/osi/test/hash_map_utils_test.cc b/osi/test/hash_map_utils_test.cc
index 1e312d4..d5df2d7 100644
--- a/osi/test/hash_map_utils_test.cc
+++ b/osi/test/hash_map_utils_test.cc
@@ -27,8 +27,8 @@
 
 class HashMapUtilsTest : public AllocationTestHarness {
  protected:
-  virtual void SetUp() { AllocationTestHarness::SetUp(); }
-  virtual void TearDown() {
+  void SetUp() override { AllocationTestHarness::SetUp(); }
+  void TearDown() override {
     map.clear();
     AllocationTestHarness::TearDown();
   }
diff --git a/osi/test/wakelock_test.cc b/osi/test/wakelock_test.cc
index 0e027be..a1dfc05 100644
--- a/osi/test/wakelock_test.cc
+++ b/osi/test/wakelock_test.cc
@@ -45,7 +45,7 @@
 
 class WakelockTest : public AllocationTestHarness {
  protected:
-  virtual void SetUp() {
+  void SetUp() override {
     AllocationTestHarness::SetUp();
 
 // TODO (jamuraa): maybe use base::CreateNewTempDirectory instead?
@@ -69,7 +69,7 @@
     creat(unlock_path_.c_str(), S_IRWXU);
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     is_wake_lock_acquired = false;
     wakelock_cleanup();
     wakelock_set_os_callouts(NULL);
diff --git a/profile/avrcp/tests/avrcp_device_test.cc b/profile/avrcp/tests/avrcp_device_test.cc
index 83c6a13..206e7e2 100644
--- a/profile/avrcp/tests/avrcp_device_test.cc
+++ b/profile/avrcp/tests/avrcp_device_test.cc
@@ -57,7 +57,7 @@
 // Add more tests to increase code coverage.
 class AvrcpDeviceTest : public ::testing::Test {
  public:
-  virtual void SetUp() override {
+  void SetUp() override {
     // NOTE: We use a wrapper lambda for the MockFunction in order to
     // add a const qualifier to the response. Otherwise the MockFunction
     // type doesn't match the callback type and a compiler error occurs.
@@ -71,7 +71,7 @@
     test_device = new Device(RawAddress::kAny, true, cb, 0xFFFF, 0xFFFF);
   }
 
-  virtual void TearDown() override {
+  void TearDown() override {
     delete test_device;
     Mock::VerifyAndClear(&response_cb);
   }
diff --git a/service/test/low_energy_client_unittest.cc b/service/test/low_energy_client_unittest.cc
index 3bf566c..ce3c7c0 100644
--- a/service/test/low_energy_client_unittest.cc
+++ b/service/test/low_energy_client_unittest.cc
@@ -58,13 +58,13 @@
   int connection_state_count() const { return connection_state_count_; }
 
   void OnConnectionState(LowEnergyClient* client, int status,
-                         const char* address, bool connected) {
+                         const char* address, bool connected) override {
     ASSERT_TRUE(client);
     connection_state_count_++;
   }
 
   void OnMtuChanged(LowEnergyClient* client, int status, const char* address,
-                    int mtu) {
+                    int mtu) override {
     ASSERT_TRUE(client);
     last_mtu_ = mtu;
   }
diff --git a/service/test/low_energy_scanner_unittest.cc b/service/test/low_energy_scanner_unittest.cc
index c8b16f3..9a7875d 100644
--- a/service/test/low_energy_scanner_unittest.cc
+++ b/service/test/low_energy_scanner_unittest.cc
@@ -72,12 +72,12 @@
   MOCK_METHOD1(StopSync, void(uint16_t));
 
   void ScanFilterAdd(int filter_index, std::vector<ApcfCommand> filters,
-                     FilterConfigCallback cb){};
+                     FilterConfigCallback cb) override{};
 
   void ScanFilterParamSetup(
       uint8_t client_if, uint8_t action, uint8_t filt_index,
       std::unique_ptr<btgatt_filt_param_setup_t> filt_param,
-      FilterParamSetupCallback cb) {
+      FilterParamSetupCallback cb) override {
     ScanFilterParamSetupImpl(client_if, action, filt_index, filt_param.get(),
                              std::move(cb));
   }
@@ -92,7 +92,8 @@
   int scan_result_count() const { return scan_result_count_; }
   const ScanResult& last_scan_result() const { return last_scan_result_; }
 
-  void OnScanResult(LowEnergyScanner* scanner, const ScanResult& scan_result) {
+  void OnScanResult(LowEnergyScanner* scanner,
+                    const ScanResult& scan_result) override {
     ASSERT_TRUE(scanner);
     scan_result_count_++;
     last_scan_result_ = scan_result;
diff --git a/stack/btm/btm_ble_multi_adv.cc b/stack/btm/btm_ble_multi_adv.cc
index 22d2e17..120b384 100644
--- a/stack/btm/btm_ble_multi_adv.cc
+++ b/stack/btm/btm_ble_multi_adv.cc
@@ -170,7 +170,7 @@
                    weak_factory_.GetWeakPtr()));
   }
 
-  ~BleAdvertisingManagerImpl() { adv_inst.clear(); }
+  ~BleAdvertisingManagerImpl() override { adv_inst.clear(); }
 
   void GetOwnAddress(uint8_t inst_id, GetAddressCallback cb) override {
     cb.Run(adv_inst[inst_id].own_address_type, adv_inst[inst_id].own_address);
diff --git a/stack/test/ble_advertiser_test.cc b/stack/test/ble_advertiser_test.cc
index 9c7d5a5..952aa41 100644
--- a/stack/test/ble_advertiser_test.cc
+++ b/stack/test/ble_advertiser_test.cc
@@ -131,7 +131,7 @@
                    cmd_complete);
   };
 
-  bool QuirkAdvertiserZeroHandle() { return false; }
+  bool QuirkAdvertiserZeroHandle() override { return false; }
 
  private:
   DISALLOW_COPY_AND_ASSIGN(AdvertiserHciMock);
@@ -153,7 +153,7 @@
 
   std::unique_ptr<AdvertiserHciMock> hci_mock;
 
-  virtual void SetUp() {
+  void SetUp() override {
     hci_mock.reset(new AdvertiserHciMock());
 
     base::Callback<void(uint8_t)> inst_cnt_Cb;
@@ -168,7 +168,7 @@
     inst_cnt_Cb.Run(num_adv_instances);
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     BleAdvertisingManager::CleanUp();
     hci_mock.reset();
   }
diff --git a/stack/test/gatt_connection_manager_test.cc b/stack/test/gatt_connection_manager_test.cc
index eed3776..0997aa8 100644
--- a/stack/test/gatt_connection_manager_test.cc
+++ b/stack/test/gatt_connection_manager_test.cc
@@ -61,11 +61,11 @@
 
 namespace connection_manager {
 class BleConnectionManager : public testing::Test {
-  virtual void SetUp() {
+  void SetUp() override {
     localWhiteListMock = std::make_unique<WhiteListMock>();
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     connection_manager::reset(true);
     AlarmMock::Reset();
     localWhiteListMock.reset();
diff --git a/stack/test/stack_btu_test.cc b/stack/test/stack_btu_test.cc
index 5976bb2..2502646 100644
--- a/stack/test/stack_btu_test.cc
+++ b/stack/test/stack_btu_test.cc
@@ -89,7 +89,7 @@
   MOCK_METHOD0(TestCallback, void(void));
   base::MessageLoop* message_loop;
 
-  virtual void SetUp() {
+  void SetUp() override {
     // Initialize alarms to prevent btu_task_shut_down from crashing
     alarm_new("test alarm");
     bt_startup_thread.StartUp();
@@ -100,7 +100,7 @@
                               "BTU startup timed out"));
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     btu_task_shut_down(nullptr);
     alarm_cleanup();
     bt_startup_thread.ShutDown();
diff --git a/stack/test/stack_smp_test.cc b/stack/test/stack_smp_test.cc
index 0b1f0a9..1bb51ea 100644
--- a/stack/test/stack_smp_test.cc
+++ b/stack/test/stack_smp_test.cc
@@ -131,7 +131,7 @@
   Octet16 rand_{0x57, 0x83, 0xD5, 0x21, 0x56, 0xAD, 0x6F, 0x0E,
                 0x63, 0x88, 0x27, 0x4E, 0xC6, 0x70, 0x2E, 0xE0};
 
-  void SetUp() {
+  void SetUp() override {
     p_cb_.tk = {0};
     // Set pairing request packet to 0x070710000001(01)
     p_cb_.local_io_capability = 0x01;
@@ -151,7 +151,7 @@
     p_cb_.role = HCI_ROLE_MASTER;
     std::reverse(rand_.begin(), rand_.end());
   }
-  void TearDown() {}
+  void TearDown() override {}
 
  public:
 };
diff --git a/test/rootcanal/bluetooth_hci.cc b/test/rootcanal/bluetooth_hci.cc
index f57f538..2fd68cb 100644
--- a/test/rootcanal/bluetooth_hci.cc
+++ b/test/rootcanal/bluetooth_hci.cc
@@ -51,7 +51,9 @@
  public:
   BluetoothDeathRecipient(const sp<IBluetoothHci> hci) : mHci(hci) {}
 
-  virtual void serviceDied(uint64_t /* cookie */, const wp<::android::hidl::base::V1_0::IBase>& /* who */) {
+  void serviceDied(
+      uint64_t /* cookie */,
+      const wp<::android::hidl::base::V1_0::IBase>& /* who */) override {
     ALOGE("BluetoothDeathRecipient::serviceDied - Bluetooth service died");
     has_died_ = true;
     mHci->close();
diff --git a/vendor_libs/linux/interface/bluetooth_hci.cc b/vendor_libs/linux/interface/bluetooth_hci.cc
index 8d7e3f7..5ed2ff6 100644
--- a/vendor_libs/linux/interface/bluetooth_hci.cc
+++ b/vendor_libs/linux/interface/bluetooth_hci.cc
@@ -245,9 +245,9 @@
  public:
   BluetoothDeathRecipient(const sp<IBluetoothHci> hci) : mHci(hci) {}
 
-  virtual void serviceDied(
+  void serviceDied(
       uint64_t /*cookie*/,
-      const wp<::android::hidl::base::V1_0::IBase>& /*who*/) {
+      const wp<::android::hidl::base::V1_0::IBase>& /*who*/) override {
     ALOGE("BluetoothDeathRecipient::serviceDied - Bluetooth service died");
     has_died_ = true;
     mHci->close();
diff --git a/vendor_libs/test_vendor_lib/packets/hci/test/acl_builder_test.cc b/vendor_libs/test_vendor_lib/packets/hci/test/acl_builder_test.cc
index 61f8415..fb34489 100644
--- a/vendor_libs/test_vendor_lib/packets/hci/test/acl_builder_test.cc
+++ b/vendor_libs/test_vendor_lib/packets/hci/test/acl_builder_test.cc
@@ -46,7 +46,7 @@
 class AclBuilderTest : public ::testing::Test {
  public:
   AclBuilderTest() = default;
-  ~AclBuilderTest() = default;
+  ~AclBuilderTest() override = default;
 };
 
 TEST(AclBuilderTest, buildAclCountTest) {
diff --git a/vendor_libs/test_vendor_lib/packets/hci/test/event_builder_test.cc b/vendor_libs/test_vendor_lib/packets/hci/test/event_builder_test.cc
index e63c866..8a11d45 100644
--- a/vendor_libs/test_vendor_lib/packets/hci/test/event_builder_test.cc
+++ b/vendor_libs/test_vendor_lib/packets/hci/test/event_builder_test.cc
@@ -38,7 +38,7 @@
 class EventBuilderTest : public ::testing::Test {
  public:
   EventBuilderTest() = default;
-  ~EventBuilderTest() = default;
+  ~EventBuilderTest() override = default;
 };
 
 TEST(EventBuilderTest, buildLeAdvertisementSmallTest) {
diff --git a/vendor_libs/test_vendor_lib/packets/test/counted_builder_test.cc b/vendor_libs/test_vendor_lib/packets/test/counted_builder_test.cc
index 8d4d53a..bedc228 100644
--- a/vendor_libs/test_vendor_lib/packets/test/counted_builder_test.cc
+++ b/vendor_libs/test_vendor_lib/packets/test/counted_builder_test.cc
@@ -38,7 +38,7 @@
 class CountedBuilderTest : public ::testing::Test {
  public:
   CountedBuilderTest() = default;
-  ~CountedBuilderTest() = default;
+  ~CountedBuilderTest() override = default;
 };
 
 TEST(CountedBuilderTest, buildCountTest) {
diff --git a/vendor_libs/test_vendor_lib/packets/test/link_layer_packet_builder_test.cc b/vendor_libs/test_vendor_lib/packets/test/link_layer_packet_builder_test.cc
index cc6c460..22ef70f 100644
--- a/vendor_libs/test_vendor_lib/packets/test/link_layer_packet_builder_test.cc
+++ b/vendor_libs/test_vendor_lib/packets/test/link_layer_packet_builder_test.cc
@@ -51,7 +51,7 @@
 class LinkLayerPacketBuilderTest : public ::testing::Test {
  public:
   LinkLayerPacketBuilderTest() = default;
-  ~LinkLayerPacketBuilderTest() = default;
+  ~LinkLayerPacketBuilderTest() override = default;
 
   Address source_{{0x01, 0x02, 0x03, 0x04, 0x05, 0x06}};
   Address dest_{{0x11, 0x12, 0x13, 0x14, 0x15, 0x16}};
diff --git a/vendor_libs/test_vendor_lib/packets/test/packet_builder_test.cc b/vendor_libs/test_vendor_lib/packets/test/packet_builder_test.cc
index 60e5d95..6fab56d 100644
--- a/vendor_libs/test_vendor_lib/packets/test/packet_builder_test.cc
+++ b/vendor_libs/test_vendor_lib/packets/test/packet_builder_test.cc
@@ -51,9 +51,9 @@
  public:
   EndianBuilder(uint8_t byte, uint16_t two_bytes, uint32_t four_bytes, uint64_t eight_bytes)
       : byte_(byte), two_bytes_(two_bytes), four_bytes_(four_bytes), eight_bytes_(eight_bytes) {}
-  ~EndianBuilder() = default;
+  ~EndianBuilder() override = default;
 
-  virtual size_t size() const override {
+  size_t size() const override {
     return sizeof(signature_) + sizeof(byte_) + sizeof(two_bytes_) + sizeof(four_bytes_) + sizeof(eight_bytes_);
   }
 
@@ -65,7 +65,8 @@
     return packet;
   }
 
-  virtual void Serialize(std::back_insert_iterator<std::vector<uint8_t>> it) const override {
+  void Serialize(
+      std::back_insert_iterator<std::vector<uint8_t>> it) const override {
     PacketBuilder<little_endian>::insert(signature_, it);
     PacketBuilder<little_endian>::insert(byte_, it);
     PacketBuilder<little_endian>::insert(two_bytes_, it);
@@ -84,7 +85,7 @@
 class PacketBuilderEndianTest : public ::testing::Test {
  public:
   PacketBuilderEndianTest() = default;
-  ~PacketBuilderEndianTest() = default;
+  ~PacketBuilderEndianTest() override = default;
 };
 
 TEST(PacketBuilderEndianTest, insertTest) {
@@ -101,11 +102,9 @@
       vect.push_back(static_cast<T>(element));
     }
   }
-  ~VectorBuilder() = default;
+  ~VectorBuilder() override = default;
 
-  virtual size_t size() const override {
-    return vect_.size() * sizeof(T);
-  }
+  size_t size() const override { return vect_.size() * sizeof(T); }
 
   virtual const std::unique_ptr<std::vector<uint8_t>> FinalPacket() {
     std::unique_ptr<std::vector<uint8_t>> packet = std::make_unique<std::vector<uint8_t>>();
@@ -115,7 +114,8 @@
     return packet;
   }
 
-  virtual void Serialize(std::back_insert_iterator<std::vector<uint8_t>> it) const override {
+  void Serialize(
+      std::back_insert_iterator<std::vector<uint8_t>> it) const override {
     PacketBuilder<true>::insert_vector(vect_, it);
   }
 
@@ -131,11 +131,9 @@
       vect.push_back(static_cast<T>(element));
     }
   }
-  virtual ~InsertElementsBuilder() = default;
+  ~InsertElementsBuilder() override = default;
 
-  virtual size_t size() const override {
-    return vect_.size() * sizeof(T);
-  }
+  size_t size() const override { return vect_.size() * sizeof(T); }
 
   virtual const std::unique_ptr<std::vector<uint8_t>> FinalPacket() {
     std::unique_ptr<std::vector<uint8_t>> packet = std::make_unique<std::vector<uint8_t>>();
@@ -145,7 +143,8 @@
     return packet;
   }
 
-  virtual void Serialize(std::back_insert_iterator<std::vector<uint8_t>> it) const override {
+  void Serialize(
+      std::back_insert_iterator<std::vector<uint8_t>> it) const override {
     for (T elem : vect_) {
       PacketBuilder<true>::insert(elem, it);
     }
@@ -164,14 +163,14 @@
 class VectorBuilderTest : public ::testing::Test {
  public:
   VectorBuilderTest() = default;
-  ~VectorBuilderTest() = default;
+  ~VectorBuilderTest() override = default;
 
-  void SetUp() {
+  void SetUp() override {
     packet_1_ = std::shared_ptr<VectorBuilder<T>>(new VectorBuilder<T>(vector_data));
     packet_2_ = std::shared_ptr<InsertElementsBuilder<T>>(new InsertElementsBuilder<T>(vector_data));
   }
 
-  void TearDown() {
+  void TearDown() override {
     packet_1_.reset();
     packet_2_.reset();
   }
@@ -189,9 +188,9 @@
 
 class NestedBuilder : public PacketBuilder<true> {
  public:
-  ~NestedBuilder() = default;
+  ~NestedBuilder() override = default;
 
-  virtual size_t size() const override {
+  size_t size() const override {
     size_t payload_size = (payload_ ? payload_->size() : 0);
     return 1 + payload_size;
   }
@@ -212,7 +211,8 @@
     return packet;
   }
 
-  virtual void Serialize(std::back_insert_iterator<std::vector<uint8_t>> it) const override {
+  void Serialize(
+      std::back_insert_iterator<std::vector<uint8_t>> it) const override {
     PacketBuilder<true>::insert(level_, it);
     if (payload_) {
       payload_->Serialize(it);
diff --git a/vendor_libs/test_vendor_lib/packets/test/packet_view_test.cc b/vendor_libs/test_vendor_lib/packets/test/packet_view_test.cc
index 65cd305..b234c20 100644
--- a/vendor_libs/test_vendor_lib/packets/test/packet_view_test.cc
+++ b/vendor_libs/test_vendor_lib/packets/test/packet_view_test.cc
@@ -52,15 +52,13 @@
 class IteratorTest : public ::testing::Test {
  public:
   IteratorTest() = default;
-  ~IteratorTest() = default;
+  ~IteratorTest() override = default;
 
-  void SetUp() {
+  void SetUp() override {
     packet = std::shared_ptr<T>(new T({View(std::make_shared<const vector<uint8_t>>(count_all), 0, count_all.size())}));
   }
 
-  void TearDown() {
-    packet.reset();
-  }
+  void TearDown() override { packet.reset(); }
 
   std::shared_ptr<T> packet;
 };
@@ -71,14 +69,14 @@
 class IteratorExtractTest : public ::testing::Test {
  public:
   IteratorExtractTest() = default;
-  ~IteratorExtractTest() = default;
+  ~IteratorExtractTest() override = default;
 };
 
 template <typename T>
 class PacketViewTest : public IteratorTest<T> {
  public:
   PacketViewTest() = default;
-  ~PacketViewTest() = default;
+  ~PacketViewTest() override = default;
 };
 
 using PacketViewTypes = ::testing::Types<PacketView<true>, PacketView<false>>;
@@ -87,13 +85,13 @@
 class PacketViewMultiViewTest : public ::testing::Test {
  public:
   PacketViewMultiViewTest() = default;
-  ~PacketViewMultiViewTest() = default;
+  ~PacketViewMultiViewTest() override = default;
 };
 
 class ViewTest : public ::testing::Test {
  public:
   ViewTest() = default;
-  ~ViewTest() = default;
+  ~ViewTest() override = default;
 };
 
 TEST(IteratorExtractTest, extractLeTest) {
diff --git a/vendor_libs/test_vendor_lib/packets/test/raw_builder_test.cc b/vendor_libs/test_vendor_lib/packets/test/raw_builder_test.cc
index f67ba0b..a179b8b 100644
--- a/vendor_libs/test_vendor_lib/packets/test/raw_builder_test.cc
+++ b/vendor_libs/test_vendor_lib/packets/test/raw_builder_test.cc
@@ -38,7 +38,7 @@
 class RawBuilderTest : public ::testing::Test {
  public:
   RawBuilderTest() = default;
-  ~RawBuilderTest() = default;
+  ~RawBuilderTest() override = default;
 };
 
 TEST(RawBuilderTest, buildCountTest) {
diff --git a/vendor_libs/test_vendor_lib/test/iterator_test.cc b/vendor_libs/test_vendor_lib/test/iterator_test.cc
index 4a85068..b65b60f 100644
--- a/vendor_libs/test_vendor_lib/test/iterator_test.cc
+++ b/vendor_libs/test_vendor_lib/test/iterator_test.cc
@@ -46,15 +46,13 @@
 class IteratorTest : public ::testing::Test {
  public:
   IteratorTest() = default;
-  ~IteratorTest() = default;
+  ~IteratorTest() override = default;
 
-  void SetUp() {
+  void SetUp() override {
     packet = TestPacket::make_new_packet(complete_l2cap_packet);
   }
 
-  void TearDown() {
-    packet.reset();
-  }
+  void TearDown() override { packet.reset(); }
 
   std::shared_ptr<TestPacket> packet;
 };
diff --git a/vendor_libs/test_vendor_lib/test/l2cap_sdu_test.cc b/vendor_libs/test_vendor_lib/test/l2cap_sdu_test.cc
index 3a1cd5c..7aa0ec6 100644
--- a/vendor_libs/test_vendor_lib/test/l2cap_sdu_test.cc
+++ b/vendor_libs/test_vendor_lib/test/l2cap_sdu_test.cc
@@ -39,7 +39,7 @@
  public:
   L2capSduTest(){};
 
-  ~L2capSduTest() = default;
+  ~L2capSduTest() override = default;
 
 };  // L2capSduTest
 
diff --git a/vendor_libs/test_vendor_lib/test/link_layer_socket_device_test.cc b/vendor_libs/test_vendor_lib/test/link_layer_socket_device_test.cc
index f24bf0e..0ddd2fc 100644
--- a/vendor_libs/test_vendor_lib/test/link_layer_socket_device_test.cc
+++ b/vendor_libs/test_vendor_lib/test/link_layer_socket_device_test.cc
@@ -60,11 +60,11 @@
    public:
     MockPhyLayer(const std::function<void(std::shared_ptr<LinkLayerPacketBuilder>)>& on_receive)
         : PhyLayer(Phy::Type::LOW_ENERGY, 0, [](LinkLayerPacketView) {}), on_receive_(on_receive) {}
-    virtual void Send(const std::shared_ptr<LinkLayerPacketBuilder> packet) override {
+    void Send(const std::shared_ptr<LinkLayerPacketBuilder> packet) override {
       on_receive_(packet);
     }
-    virtual void Receive(LinkLayerPacketView) override {}
-    virtual void TimerTick() override {}
+    void Receive(LinkLayerPacketView) override {}
+    void TimerTick() override {}
 
    private:
     std::function<void(std::shared_ptr<LinkLayerPacketBuilder>)> on_receive_;
diff --git a/vendor_libs/test_vendor_lib/test/packet_builder_test.cc b/vendor_libs/test_vendor_lib/test/packet_builder_test.cc
index 60e5d95..6fab56d 100644
--- a/vendor_libs/test_vendor_lib/test/packet_builder_test.cc
+++ b/vendor_libs/test_vendor_lib/test/packet_builder_test.cc
@@ -51,9 +51,9 @@
  public:
   EndianBuilder(uint8_t byte, uint16_t two_bytes, uint32_t four_bytes, uint64_t eight_bytes)
       : byte_(byte), two_bytes_(two_bytes), four_bytes_(four_bytes), eight_bytes_(eight_bytes) {}
-  ~EndianBuilder() = default;
+  ~EndianBuilder() override = default;
 
-  virtual size_t size() const override {
+  size_t size() const override {
     return sizeof(signature_) + sizeof(byte_) + sizeof(two_bytes_) + sizeof(four_bytes_) + sizeof(eight_bytes_);
   }
 
@@ -65,7 +65,8 @@
     return packet;
   }
 
-  virtual void Serialize(std::back_insert_iterator<std::vector<uint8_t>> it) const override {
+  void Serialize(
+      std::back_insert_iterator<std::vector<uint8_t>> it) const override {
     PacketBuilder<little_endian>::insert(signature_, it);
     PacketBuilder<little_endian>::insert(byte_, it);
     PacketBuilder<little_endian>::insert(two_bytes_, it);
@@ -84,7 +85,7 @@
 class PacketBuilderEndianTest : public ::testing::Test {
  public:
   PacketBuilderEndianTest() = default;
-  ~PacketBuilderEndianTest() = default;
+  ~PacketBuilderEndianTest() override = default;
 };
 
 TEST(PacketBuilderEndianTest, insertTest) {
@@ -101,11 +102,9 @@
       vect.push_back(static_cast<T>(element));
     }
   }
-  ~VectorBuilder() = default;
+  ~VectorBuilder() override = default;
 
-  virtual size_t size() const override {
-    return vect_.size() * sizeof(T);
-  }
+  size_t size() const override { return vect_.size() * sizeof(T); }
 
   virtual const std::unique_ptr<std::vector<uint8_t>> FinalPacket() {
     std::unique_ptr<std::vector<uint8_t>> packet = std::make_unique<std::vector<uint8_t>>();
@@ -115,7 +114,8 @@
     return packet;
   }
 
-  virtual void Serialize(std::back_insert_iterator<std::vector<uint8_t>> it) const override {
+  void Serialize(
+      std::back_insert_iterator<std::vector<uint8_t>> it) const override {
     PacketBuilder<true>::insert_vector(vect_, it);
   }
 
@@ -131,11 +131,9 @@
       vect.push_back(static_cast<T>(element));
     }
   }
-  virtual ~InsertElementsBuilder() = default;
+  ~InsertElementsBuilder() override = default;
 
-  virtual size_t size() const override {
-    return vect_.size() * sizeof(T);
-  }
+  size_t size() const override { return vect_.size() * sizeof(T); }
 
   virtual const std::unique_ptr<std::vector<uint8_t>> FinalPacket() {
     std::unique_ptr<std::vector<uint8_t>> packet = std::make_unique<std::vector<uint8_t>>();
@@ -145,7 +143,8 @@
     return packet;
   }
 
-  virtual void Serialize(std::back_insert_iterator<std::vector<uint8_t>> it) const override {
+  void Serialize(
+      std::back_insert_iterator<std::vector<uint8_t>> it) const override {
     for (T elem : vect_) {
       PacketBuilder<true>::insert(elem, it);
     }
@@ -164,14 +163,14 @@
 class VectorBuilderTest : public ::testing::Test {
  public:
   VectorBuilderTest() = default;
-  ~VectorBuilderTest() = default;
+  ~VectorBuilderTest() override = default;
 
-  void SetUp() {
+  void SetUp() override {
     packet_1_ = std::shared_ptr<VectorBuilder<T>>(new VectorBuilder<T>(vector_data));
     packet_2_ = std::shared_ptr<InsertElementsBuilder<T>>(new InsertElementsBuilder<T>(vector_data));
   }
 
-  void TearDown() {
+  void TearDown() override {
     packet_1_.reset();
     packet_2_.reset();
   }
@@ -189,9 +188,9 @@
 
 class NestedBuilder : public PacketBuilder<true> {
  public:
-  ~NestedBuilder() = default;
+  ~NestedBuilder() override = default;
 
-  virtual size_t size() const override {
+  size_t size() const override {
     size_t payload_size = (payload_ ? payload_->size() : 0);
     return 1 + payload_size;
   }
@@ -212,7 +211,8 @@
     return packet;
   }
 
-  virtual void Serialize(std::back_insert_iterator<std::vector<uint8_t>> it) const override {
+  void Serialize(
+      std::back_insert_iterator<std::vector<uint8_t>> it) const override {
     PacketBuilder<true>::insert(level_, it);
     if (payload_) {
       payload_->Serialize(it);
diff --git a/vendor_libs/test_vendor_lib/test/packet_stream_unittest.cc b/vendor_libs/test_vendor_lib/test/packet_stream_unittest.cc
index 375c090..7481235 100644
--- a/vendor_libs/test_vendor_lib/test/packet_stream_unittest.cc
+++ b/vendor_libs/test_vendor_lib/test/packet_stream_unittest.cc
@@ -48,7 +48,7 @@
     CheckSocketpairInit();
   }
 
-  ~PacketStreamTest() {
+  ~PacketStreamTest() override {
     close(socketpair_fds_[0]);
     close(socketpair_fds_[1]);
   }
diff --git a/vendor_libs/test_vendor_lib/test/security_manager_unittest.cc b/vendor_libs/test_vendor_lib/test/security_manager_unittest.cc
index 8fa3a03..13aab3c 100644
--- a/vendor_libs/test_vendor_lib/test/security_manager_unittest.cc
+++ b/vendor_libs/test_vendor_lib/test/security_manager_unittest.cc
@@ -39,7 +39,7 @@
 class SecurityManagerTest : public ::testing::Test {
  public:
   SecurityManagerTest() {}
-  ~SecurityManagerTest() {}
+  ~SecurityManagerTest() override {}
 };
 
 TEST_F(SecurityManagerTest, WriteKey) {
