diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn
index 710de7a..8490a60 100644
--- a/rtc_base/BUILD.gn
+++ b/rtc_base/BUILD.gn
@@ -716,10 +716,6 @@
     defines += [ "timezone=_timezone" ]
     sources -= [ "ifaddrs_converter.cc" ]
   }
-  if (is_win && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
 }
 
 rtc_source_set("gtest_prod") {
@@ -752,6 +748,7 @@
     "fakeclock.cc",
     "fakeclock.h",
     "fakenetwork.h",
+    "fakesslidentity.cc",
     "fakesslidentity.h",
     "firewallsocketserver.cc",
     "firewallsocketserver.h",
@@ -782,7 +779,9 @@
     "testbase64.h",
     "testclient.cc",
     "testclient.h",
+    "testechoserver.cc",
     "testechoserver.h",
+    "testutils.cc",
     "testutils.h",
     "timedelta.h",
     "virtualsocketserver.cc",
@@ -799,11 +798,6 @@
     "//testing/gmock",
     "//testing/gtest",
   ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
 }
 
 if (rtc_include_tests) {
@@ -825,11 +819,6 @@
       "//testing/gmock",
       "//testing/gtest",
     ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
   }
 
   rtc_source_set("rtc_base_nonparallel_tests") {
@@ -862,11 +851,6 @@
     if (is_win) {
       sources += [ "win32socketserver_unittest.cc" ]
     }
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
   }
 
   rtc_source_set("rtc_base_approved_unittests") {
@@ -931,10 +915,6 @@
       "../system_wrappers:system_wrappers",
       "../test:test_support",
     ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
   }
 
   rtc_source_set("rtc_task_queue_unittests") {
@@ -957,10 +937,6 @@
       ":rtc_task_queue",
       "../test:test_support",
     ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
   }
 
   rtc_source_set("sequenced_task_checker_unittests") {
@@ -1096,10 +1072,6 @@
       ":rtc_base",
     ]
     configs += [ ":rtc_base_unittests_config" ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
     if (build_with_chromium) {
       include_dirs = [ "../../boringssl/src/include" ]
     }
diff --git a/rtc_base/buffer_unittest.cc b/rtc_base/buffer_unittest.cc
index 2eaf6f4..5cd1889 100644
--- a/rtc_base/buffer_unittest.cc
+++ b/rtc_base/buffer_unittest.cc
@@ -359,14 +359,14 @@
 TEST(BufferTest, TestBeginEnd) {
   const Buffer cbuf(kTestData);
   Buffer buf(kTestData);
-  auto b1 = cbuf.begin();
+  auto* b1 = cbuf.begin();
   for (auto& x : buf) {
     EXPECT_EQ(*b1, x);
     ++b1;
     ++x;
   }
   EXPECT_EQ(cbuf.end(), b1);
-  auto b2 = buf.begin();
+  auto* b2 = buf.begin();
   for (auto& y : cbuf) {
     EXPECT_EQ(*b2, y + 1);
     ++b2;
diff --git a/rtc_base/fakesslidentity.cc b/rtc_base/fakesslidentity.cc
new file mode 100644
index 0000000..296f09c
--- /dev/null
+++ b/rtc_base/fakesslidentity.cc
@@ -0,0 +1,118 @@
+/*
+ *  Copyright 2017 The WebRTC Project Authors. All rights reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include "rtc_base/fakesslidentity.h"
+
+#include <algorithm>
+#include <string>
+#include <utility>
+
+#include "rtc_base/checks.h"
+#include "rtc_base/messagedigest.h"
+#include "rtc_base/ptr_util.h"
+
+namespace rtc {
+
+FakeSSLCertificate::FakeSSLCertificate(const std::string& data)
+    : data_(data), digest_algorithm_(DIGEST_SHA_1), expiration_time_(-1) {}
+
+FakeSSLCertificate::FakeSSLCertificate(const std::vector<std::string>& certs)
+    : data_(certs.front()),
+      digest_algorithm_(DIGEST_SHA_1),
+      expiration_time_(-1) {
+  std::vector<std::string>::const_iterator it;
+  // Skip certs[0].
+  for (it = certs.begin() + 1; it != certs.end(); ++it) {
+    certs_.push_back(FakeSSLCertificate(*it));
+  }
+}
+
+FakeSSLCertificate::FakeSSLCertificate(const FakeSSLCertificate&) = default;
+
+FakeSSLCertificate::~FakeSSLCertificate() = default;
+
+FakeSSLCertificate* FakeSSLCertificate::GetReference() const {
+  return new FakeSSLCertificate(*this);
+}
+
+std::string FakeSSLCertificate::ToPEMString() const {
+  return data_;
+}
+
+void FakeSSLCertificate::ToDER(Buffer* der_buffer) const {
+  std::string der_string;
+  RTC_CHECK(SSLIdentity::PemToDer(kPemTypeCertificate, data_, &der_string));
+  der_buffer->SetData(der_string.c_str(), der_string.size());
+}
+
+int64_t FakeSSLCertificate::CertificateExpirationTime() const {
+  return expiration_time_;
+}
+
+void FakeSSLCertificate::SetCertificateExpirationTime(int64_t expiration_time) {
+  expiration_time_ = expiration_time;
+}
+
+void FakeSSLCertificate::set_digest_algorithm(const std::string& algorithm) {
+  digest_algorithm_ = algorithm;
+}
+
+bool FakeSSLCertificate::GetSignatureDigestAlgorithm(
+    std::string* algorithm) const {
+  *algorithm = digest_algorithm_;
+  return true;
+}
+
+bool FakeSSLCertificate::ComputeDigest(const std::string& algorithm,
+                                       unsigned char* digest,
+                                       size_t size,
+                                       size_t* length) const {
+  *length =
+      rtc::ComputeDigest(algorithm, data_.c_str(), data_.size(), digest, size);
+  return (*length != 0);
+}
+
+std::unique_ptr<SSLCertChain> FakeSSLCertificate::GetChain() const {
+  if (certs_.empty())
+    return nullptr;
+  std::vector<std::unique_ptr<SSLCertificate>> new_certs(certs_.size());
+  std::transform(certs_.begin(), certs_.end(), new_certs.begin(), DupCert);
+  return MakeUnique<SSLCertChain>(std::move(new_certs));
+}
+
+FakeSSLIdentity::FakeSSLIdentity(const std::string& data) : cert_(data) {}
+
+FakeSSLIdentity::FakeSSLIdentity(const FakeSSLCertificate& cert)
+    : cert_(cert) {}
+
+FakeSSLIdentity* FakeSSLIdentity::GetReference() const {
+  return new FakeSSLIdentity(*this);
+}
+
+const FakeSSLCertificate& FakeSSLIdentity::certificate() const {
+  return cert_;
+}
+
+std::string FakeSSLIdentity::PrivateKeyToPEMString() const {
+  RTC_NOTREACHED();  // Not implemented.
+  return "";
+}
+
+std::string FakeSSLIdentity::PublicKeyToPEMString() const {
+  RTC_NOTREACHED();  // Not implemented.
+  return "";
+}
+
+bool FakeSSLIdentity::operator==(const SSLIdentity& other) const {
+  RTC_NOTREACHED();  // Not implemented.
+  return false;
+}
+
+}  // namespace rtc
diff --git a/rtc_base/fakesslidentity.h b/rtc_base/fakesslidentity.h
index 3050729..52aaf05 100644
--- a/rtc_base/fakesslidentity.h
+++ b/rtc_base/fakesslidentity.h
@@ -11,13 +11,9 @@
 #ifndef RTC_BASE_FAKESSLIDENTITY_H_
 #define RTC_BASE_FAKESSLIDENTITY_H_
 
-#include <algorithm>
 #include <memory>
 #include <vector>
 
-#include "rtc_base/checks.h"
-#include "rtc_base/messagedigest.h"
-#include "rtc_base/ptr_util.h"
 #include "rtc_base/sslidentity.h"
 
 namespace rtc {
@@ -26,57 +22,28 @@
  public:
   // SHA-1 is the default digest algorithm because it is available in all build
   // configurations used for unit testing.
-  explicit FakeSSLCertificate(const std::string& data)
-      : data_(data), digest_algorithm_(DIGEST_SHA_1), expiration_time_(-1) {}
-  explicit FakeSSLCertificate(const std::vector<std::string>& certs)
-      : data_(certs.front()),
-        digest_algorithm_(DIGEST_SHA_1),
-        expiration_time_(-1) {
-    std::vector<std::string>::const_iterator it;
-    // Skip certs[0].
-    for (it = certs.begin() + 1; it != certs.end(); ++it) {
-      certs_.push_back(FakeSSLCertificate(*it));
-    }
-  }
-  FakeSSLCertificate* GetReference() const override {
-    return new FakeSSLCertificate(*this);
-  }
-  std::string ToPEMString() const override {
-    return data_;
-  }
-  void ToDER(Buffer* der_buffer) const override {
-    std::string der_string;
-    RTC_CHECK(SSLIdentity::PemToDer(kPemTypeCertificate, data_, &der_string));
-    der_buffer->SetData(der_string.c_str(), der_string.size());
-  }
-  int64_t CertificateExpirationTime() const override {
-    return expiration_time_;
-  }
-  void SetCertificateExpirationTime(int64_t expiration_time) {
-    expiration_time_ = expiration_time;
-  }
-  void set_digest_algorithm(const std::string& algorithm) {
-    digest_algorithm_ = algorithm;
-  }
-  bool GetSignatureDigestAlgorithm(std::string* algorithm) const override {
-    *algorithm = digest_algorithm_;
-    return true;
-  }
+  explicit FakeSSLCertificate(const std::string& data);
+
+  explicit FakeSSLCertificate(const std::vector<std::string>& certs);
+
+  FakeSSLCertificate(const FakeSSLCertificate&);
+  ~FakeSSLCertificate() override;
+
+  // SSLCertificate implementation.
+  FakeSSLCertificate* GetReference() const override;
+  std::string ToPEMString() const override;
+  void ToDER(Buffer* der_buffer) const override;
+  int64_t CertificateExpirationTime() const override;
+  bool GetSignatureDigestAlgorithm(std::string* algorithm) const override;
   bool ComputeDigest(const std::string& algorithm,
                      unsigned char* digest,
                      size_t size,
-                     size_t* length) const override {
-    *length = rtc::ComputeDigest(algorithm, data_.c_str(), data_.size(),
-                                       digest, size);
-    return (*length != 0);
-  }
-  std::unique_ptr<SSLCertChain> GetChain() const override {
-    if (certs_.empty())
-      return nullptr;
-    std::vector<std::unique_ptr<SSLCertificate>> new_certs(certs_.size());
-    std::transform(certs_.begin(), certs_.end(), new_certs.begin(), DupCert);
-    return MakeUnique<SSLCertChain>(std::move(new_certs));
-  }
+                     size_t* length) const override;
+  std::unique_ptr<SSLCertChain> GetChain() const override;
+
+  void SetCertificateExpirationTime(int64_t expiration_time);
+
+  void set_digest_algorithm(const std::string& algorithm);
 
  private:
   static std::unique_ptr<SSLCertificate> DupCert(FakeSSLCertificate cert) {
@@ -92,24 +59,19 @@
 
 class FakeSSLIdentity : public rtc::SSLIdentity {
  public:
-  explicit FakeSSLIdentity(const std::string& data) : cert_(data) {}
-  explicit FakeSSLIdentity(const FakeSSLCertificate& cert) : cert_(cert) {}
-  virtual FakeSSLIdentity* GetReference() const {
-    return new FakeSSLIdentity(*this);
-  }
-  virtual const FakeSSLCertificate& certificate() const { return cert_; }
-  virtual std::string PrivateKeyToPEMString() const {
-    RTC_NOTREACHED();  // Not implemented.
-    return "";
-  }
-  virtual std::string PublicKeyToPEMString() const {
-    RTC_NOTREACHED();  // Not implemented.
-    return "";
-  }
-  virtual bool operator==(const SSLIdentity& other) const {
-    RTC_NOTREACHED();  // Not implemented.
-    return false;
-  }
+  explicit FakeSSLIdentity(const std::string& data);
+  explicit FakeSSLIdentity(const FakeSSLCertificate& cert);
+
+  // SSLIdentity implementation.
+  FakeSSLIdentity* GetReference() const override;
+  const FakeSSLCertificate& certificate() const override;
+  // Not implemented.
+  std::string PrivateKeyToPEMString() const override;
+  // Not implemented.
+  std::string PublicKeyToPEMString() const override;
+  // Not implemented.
+  virtual bool operator==(const SSLIdentity& other) const;
+
  private:
   FakeSSLCertificate cert_;
 };
diff --git a/rtc_base/filerotatingstream_unittest.cc b/rtc_base/filerotatingstream_unittest.cc
index 3507ba5..16db280 100644
--- a/rtc_base/filerotatingstream_unittest.cc
+++ b/rtc_base/filerotatingstream_unittest.cc
@@ -224,7 +224,7 @@
         new CallSessionFileRotatingStream(dir_path_, max_total_log_size));
   }
 
-  virtual void TearDown() {
+  void TearDown() override {
     // On windows, open files can't be removed.
     stream_->Close();
     CleanupLogDirectory(*stream_);
diff --git a/rtc_base/httpbase_unittest.cc b/rtc_base/httpbase_unittest.cc
index f3e950b..4c92f9b 100644
--- a/rtc_base/httpbase_unittest.cc
+++ b/rtc_base/httpbase_unittest.cc
@@ -56,14 +56,13 @@
   };
   HttpBaseTest() : mem(nullptr), obtain_stream(false), http_stream(nullptr) {}
 
-  virtual void SetUp() { }
-  virtual void TearDown() {
+  void TearDown() override {
     delete http_stream;
     // Avoid an ASSERT, in case a test doesn't clean up properly
     base.abort(HE_NONE);
   }
 
-  virtual HttpError onHttpHeaderComplete(bool chunked, size_t& data_size) {
+  HttpError onHttpHeaderComplete(bool chunked, size_t& data_size) override {
     LOG_F(LS_VERBOSE) << "chunked: " << chunked << " size: " << data_size;
     Event e = { E_HEADER_COMPLETE, chunked, data_size, HM_NONE, HE_NONE};
     events.push_back(e);
@@ -72,12 +71,12 @@
     }
     return HE_NONE;
   }
-  virtual void onHttpComplete(HttpMode mode, HttpError err) {
+  void onHttpComplete(HttpMode mode, HttpError err) override {
     LOG_F(LS_VERBOSE) << "mode: " << mode << " err: " << err;
     Event e = { E_COMPLETE, false, 0, mode, err };
     events.push_back(e);
   }
-  virtual void onHttpClosed(HttpError err) {
+  void onHttpClosed(HttpError err) override {
     LOG_F(LS_VERBOSE) << "err: " << err;
     Event e = { E_CLOSED, false, 0, HM_NONE, err };
     events.push_back(e);
diff --git a/rtc_base/httpcommon.cc b/rtc_base/httpcommon.cc
index a22f0a6..b2e4869 100644
--- a/rtc_base/httpcommon.cc
+++ b/rtc_base/httpcommon.cc
@@ -703,7 +703,7 @@
     specified_credentials(false)
   { }
 
-  virtual ~NegotiateAuthContext() {
+  ~NegotiateAuthContext() override {
     DeleteSecurityContext(&ctx);
     FreeCredentialsHandle(&cred);
   }
diff --git a/rtc_base/messagequeue_unittest.cc b/rtc_base/messagequeue_unittest.cc
index b7528cf..aa94962 100644
--- a/rtc_base/messagequeue_unittest.cc
+++ b/rtc_base/messagequeue_unittest.cc
@@ -101,10 +101,9 @@
 class DeletedMessageHandler : public MessageHandler {
  public:
   explicit DeletedMessageHandler(bool* deleted) : deleted_(deleted) { }
-  ~DeletedMessageHandler() {
-    *deleted_ = true;
-  }
-  void OnMessage(Message* msg) { }
+  ~DeletedMessageHandler() override { *deleted_ = true; }
+  void OnMessage(Message* msg) override {}
+
  private:
   bool* deleted_;
 };
diff --git a/rtc_base/network.cc b/rtc_base/network.cc
index 407c5de..bfe0fce 100644
--- a/rtc_base/network.cc
+++ b/rtc_base/network.cc
@@ -907,6 +907,8 @@
       type_(type),
       preference_(0) {}
 
+Network::Network(const Network&) = default;
+
 Network::~Network() = default;
 
 // Sets the addresses of this network. Returns true if the address set changed.
diff --git a/rtc_base/network.h b/rtc_base/network.h
index 6bddf46..5755699 100644
--- a/rtc_base/network.h
+++ b/rtc_base/network.h
@@ -288,6 +288,7 @@
           const IPAddress& prefix,
           int prefix_length,
           AdapterType type);
+  Network(const Network&);
   ~Network();
 
   sigslot::signal1<const Network*> SignalTypeChanged;
diff --git a/rtc_base/network_unittest.cc b/rtc_base/network_unittest.cc
index 29349b4..49b5e04 100644
--- a/rtc_base/network_unittest.cc
+++ b/rtc_base/network_unittest.cc
@@ -1096,7 +1096,7 @@
   std::vector<Network*> networks;
   manager.GetNetworks(&networks);
   EXPECT_TRUE(!networks.empty());
-  for (auto& network : networks) {
+  for (const auto* network : networks) {
     if (network->GetBestIP().family() == AF_INET) {
       EXPECT_TRUE(manager.QueryDefaultLocalAddress(AF_INET) != IPAddress());
     } else if (network->GetBestIP().family() == AF_INET6 &&
diff --git a/rtc_base/nullsocketserver_unittest.cc b/rtc_base/nullsocketserver_unittest.cc
index 29f4980..e3d9952 100644
--- a/rtc_base/nullsocketserver_unittest.cc
+++ b/rtc_base/nullsocketserver_unittest.cc
@@ -18,12 +18,9 @@
 class NullSocketServerTest
     : public testing::Test,
       public MessageHandler {
- public:
-  NullSocketServerTest() {}
  protected:
-  virtual void OnMessage(Message* message) {
-    ss_.WakeUp();
-  }
+  void OnMessage(Message* message) override { ss_.WakeUp(); }
+
   NullSocketServer ss_;
 };
 
diff --git a/rtc_base/physicalsocketserver.cc b/rtc_base/physicalsocketserver.cc
index d61e3e7..db27827 100644
--- a/rtc_base/physicalsocketserver.cc
+++ b/rtc_base/physicalsocketserver.cc
@@ -1152,7 +1152,7 @@
     }
   }
 
-  ~EventDispatcher() {
+  ~EventDispatcher() override {
     if (hev_ != nullptr) {
       ss_->Remove(this);
       WSACloseEvent(hev_);
@@ -1165,23 +1165,19 @@
       WSASetEvent(hev_);
   }
 
-  virtual uint32_t GetRequestedEvents() { return 0; }
+  uint32_t GetRequestedEvents() override { return 0; }
 
-  virtual void OnPreEvent(uint32_t ff) { WSAResetEvent(hev_); }
+  void OnPreEvent(uint32_t ff) override { WSAResetEvent(hev_); }
 
-  virtual void OnEvent(uint32_t ff, int err) {}
+  void OnEvent(uint32_t ff, int err) override {}
 
-  virtual WSAEVENT GetWSAEvent() {
-    return hev_;
-  }
+  WSAEVENT GetWSAEvent() override { return hev_; }
 
-  virtual SOCKET GetSocket() {
-    return INVALID_SOCKET;
-  }
+  SOCKET GetSocket() override { return INVALID_SOCKET; }
 
-  virtual bool CheckSignalClose() { return false; }
+  bool CheckSignalClose() override { return false; }
 
-private:
+ private:
   PhysicalSocketServer* ss_;
   WSAEVENT hev_;
 };
diff --git a/rtc_base/physicalsocketserver_unittest.cc b/rtc_base/physicalsocketserver_unittest.cc
index 36d1881..2320e97 100644
--- a/rtc_base/physicalsocketserver_unittest.cc
+++ b/rtc_base/physicalsocketserver_unittest.cc
@@ -506,11 +506,9 @@
   }
 
  protected:
-  void SetUp() {
-    ss_.reset(new PhysicalSocketServer());
-  }
+  void SetUp() override { ss_.reset(new PhysicalSocketServer()); }
 
-  void TearDown() {
+  void TearDown() override {
     ss_.reset(nullptr);
     signals_received_.clear();
     signaled_thread_ = nullptr;
@@ -584,7 +582,7 @@
 }
 
 class RaiseSigTermRunnable : public Runnable {
-  void Run(Thread *thread) {
+  void Run(Thread* thread) override {
     thread->socketserver()->Wait(1000, false);
 
     // Allow SIGTERM. This will be the only thread with it not masked so it will
diff --git a/rtc_base/proxy_unittest.cc b/rtc_base/proxy_unittest.cc
index d236002..7d7b6f8 100644
--- a/rtc_base/proxy_unittest.cc
+++ b/rtc_base/proxy_unittest.cc
@@ -37,7 +37,6 @@
     https_.reset(new rtc::HttpListenServer());
     https_->Listen(kHttpsProxyIntAddr);
   }
-  ~ProxyTest() {}
 
   rtc::SocketServer* ss() { return ss_.get(); }
 
diff --git a/rtc_base/rtccertificate_unittest.cc b/rtc_base/rtccertificate_unittest.cc
index 980e1a8..04a7676 100644
--- a/rtc_base/rtccertificate_unittest.cc
+++ b/rtc_base/rtccertificate_unittest.cc
@@ -30,10 +30,6 @@
 }  // namespace
 
 class RTCCertificateTest : public testing::Test {
- public:
-  RTCCertificateTest() {}
-  ~RTCCertificateTest() {}
-
  protected:
   scoped_refptr<RTCCertificate> GenerateECDSA() {
     std::unique_ptr<SSLIdentity> identity(
diff --git a/rtc_base/rtccertificategenerator_unittest.cc b/rtc_base/rtccertificategenerator_unittest.cc
index 4ff6880..9a0ad0c 100644
--- a/rtc_base/rtccertificategenerator_unittest.cc
+++ b/rtc_base/rtccertificategenerator_unittest.cc
@@ -72,7 +72,6 @@
  public:
   RTCCertificateGeneratorTest()
       : fixture_(new RefCountedObject<RTCCertificateGeneratorFixture>()) {}
-  ~RTCCertificateGeneratorTest() {}
 
  protected:
   static const int kGenerationTimeoutMs = 10000;
diff --git a/rtc_base/signalthread_unittest.cc b/rtc_base/signalthread_unittest.cc
index e434c81..078710b 100644
--- a/rtc_base/signalthread_unittest.cc
+++ b/rtc_base/signalthread_unittest.cc
@@ -26,7 +26,7 @@
    public:
     SlowSignalThread(SignalThreadTest* harness) : harness_(harness) {}
 
-    virtual ~SlowSignalThread() {
+    ~SlowSignalThread() override {
       EXPECT_EQ(harness_->main_thread_, Thread::Current());
       ++harness_->thread_deleted_;
     }
@@ -34,26 +34,26 @@
     const SignalThreadTest* harness() { return harness_; }
 
    protected:
-    virtual void OnWorkStart() {
+    void OnWorkStart() override {
       ASSERT_TRUE(harness_ != nullptr);
       ++harness_->thread_started_;
       EXPECT_EQ(harness_->main_thread_, Thread::Current());
       EXPECT_FALSE(worker()->RunningForTest());  // not started yet
     }
 
-    virtual void OnWorkStop() {
+    void OnWorkStop() override {
       ++harness_->thread_stopped_;
       EXPECT_EQ(harness_->main_thread_, Thread::Current());
       EXPECT_TRUE(worker()->RunningForTest());  // not stopped yet
     }
 
-    virtual void OnWorkDone() {
+    void OnWorkDone() override {
       ++harness_->thread_done_;
       EXPECT_EQ(harness_->main_thread_, Thread::Current());
       EXPECT_TRUE(worker()->RunningForTest());  // not stopped yet
     }
 
-    virtual void DoWork() {
+    void DoWork() override {
       EXPECT_NE(harness_->main_thread_, Thread::Current());
       EXPECT_EQ(worker(), Thread::Current());
       Thread::Current()->socketserver()->Wait(250, false);
@@ -75,7 +75,7 @@
     }
   }
 
-  virtual void SetUp() {
+  void SetUp() override {
     main_thread_ = Thread::Current();
     thread_ = new SlowSignalThread(this);
     thread_->SignalWorkDone.connect(this, &SignalThreadTest::OnWorkComplete);
@@ -87,8 +87,6 @@
     thread_deleted_ = 0;
   }
 
-  virtual void TearDown() {}
-
   void ExpectState(int started,
                    int done,
                    int completed,
@@ -130,9 +128,9 @@
   explicit OwnerThread(SignalThreadTest* harness)
       : harness_(harness), has_run_(false) {}
 
-  virtual ~OwnerThread() { Stop(); }
+  ~OwnerThread() override { Stop(); }
 
-  virtual void Run() {
+  void Run() override {
     SignalThreadTest::SlowSignalThread* signal_thread =
         new SignalThreadTest::SlowSignalThread(harness_);
     signal_thread->SignalWorkDone.connect(this, &OwnerThread::OnWorkDone);
diff --git a/rtc_base/sigslot_unittest.cc b/rtc_base/sigslot_unittest.cc
index e60d301..234bf45 100644
--- a/rtc_base/sigslot_unittest.cc
+++ b/rtc_base/sigslot_unittest.cc
@@ -125,7 +125,7 @@
  protected:
   SigslotMTLockTest() {}
 
-  virtual void SetUp() {
+  void SetUp() override {
     EXPECT_EQ(0, SlotLockCount());
     SigslotMTLockBase::SetUp();
     // Connects to two signals (ST and MT). However,
@@ -134,7 +134,7 @@
     // keep track of their own count).
     EXPECT_EQ(1, SlotLockCount());
   }
-  virtual void TearDown() {
+  void TearDown() override {
     const int previous_lock_count = SlotLockCount();
     SigslotMTLockBase::TearDown();
     // Disconnects from two signals. Note analogous to SetUp().
diff --git a/rtc_base/socket_unittest.cc b/rtc_base/socket_unittest.cc
index 5548c02..9e44572 100644
--- a/rtc_base/socket_unittest.cc
+++ b/rtc_base/socket_unittest.cc
@@ -41,6 +41,10 @@
 // Data size to be used in TcpInternal tests.
 static const size_t kTcpInternalDataSize = 1024 * 1024;  // bytes
 
+void SocketTest::SetUp() {
+  ss_ = Thread::Current()->socketserver();
+}
+
 void SocketTest::TestConnectIPv4() {
   ConnectInternal(kIPv4Loopback);
 }
@@ -637,10 +641,7 @@
 
 class Sleeper : public MessageHandler {
  public:
-  Sleeper() {}
-  void OnMessage(Message* msg) {
-    Thread::Current()->SleepMs(500);
-  }
+  void OnMessage(Message* msg) override { Thread::Current()->SleepMs(500); }
 };
 
 void SocketTest::SocketServerWaitInternal(const IPAddress& loopback) {
diff --git a/rtc_base/socket_unittest.h b/rtc_base/socket_unittest.h
index 41835d2..55df219 100644
--- a/rtc_base/socket_unittest.h
+++ b/rtc_base/socket_unittest.h
@@ -24,7 +24,7 @@
   SocketTest() : kIPv4Loopback(INADDR_LOOPBACK),
                  kIPv6Loopback(in6addr_loopback),
                  ss_(nullptr) {}
-  virtual void SetUp() { ss_ = Thread::Current()->socketserver(); }
+  void SetUp() override;
   void TestConnectIPv4();
   void TestConnectIPv6();
   void TestConnectWithDnsLookupIPv4();
diff --git a/rtc_base/sslidentity_unittest.cc b/rtc_base/sslidentity_unittest.cc
index 7d9f82c..6932298 100644
--- a/rtc_base/sslidentity_unittest.cc
+++ b/rtc_base/sslidentity_unittest.cc
@@ -207,12 +207,7 @@
 
 class SSLIdentityTest : public testing::Test {
  public:
-  SSLIdentityTest() {}
-
-  ~SSLIdentityTest() {
-  }
-
-  virtual void SetUp() {
+  void SetUp() override {
     identity_rsa1_.reset(SSLIdentity::Generate("test1", rtc::KT_RSA));
     identity_rsa2_.reset(SSLIdentity::Generate("test2", rtc::KT_RSA));
     identity_ecdsa1_.reset(SSLIdentity::Generate("test3", rtc::KT_ECDSA));
@@ -499,7 +494,7 @@
     // Set use of the test RNG to get deterministic expiration timestamp.
     rtc::SetRandomTestMode(true);
   }
-  ~SSLIdentityExpirationTest() {
+  ~SSLIdentityExpirationTest() override {
     // Put it back for the next test.
     rtc::SetRandomTestMode(false);
   }
diff --git a/rtc_base/sslstreamadapter_unittest.cc b/rtc_base/sslstreamadapter_unittest.cc
index 03aabd8..3999ac5 100644
--- a/rtc_base/sslstreamadapter_unittest.cc
+++ b/rtc_base/sslstreamadapter_unittest.cc
@@ -241,7 +241,7 @@
     rtc::SetRandomTestMode(true);
   }
 
-  ~SSLStreamAdapterTestBase() {
+  ~SSLStreamAdapterTestBase() override {
     // Put it back for the next test.
     rtc::SetRandomTestMode(false);
   }
diff --git a/rtc_base/stream_unittest.cc b/rtc_base/stream_unittest.cc
index fc0ecf8..8c305c5 100644
--- a/rtc_base/stream_unittest.cc
+++ b/rtc_base/stream_unittest.cc
@@ -21,9 +21,12 @@
  public:
   TestStream() : pos_(0) { }
 
-  virtual StreamState GetState() const { return SS_OPEN; }
-  virtual StreamResult Read(void* buffer, size_t buffer_len,
-                            size_t* read, int* error) {
+  StreamState GetState() const override { return SS_OPEN; }
+
+  StreamResult Read(void* buffer,
+                    size_t buffer_len,
+                    size_t* read,
+                    int* error) override {
     unsigned char* uc_buffer = static_cast<unsigned char*>(buffer);
     for (size_t i = 0; i < buffer_len; ++i) {
       uc_buffer[i] = static_cast<unsigned char>(pos_++);
@@ -32,27 +35,31 @@
       *read = buffer_len;
     return SR_SUCCESS;
   }
-  virtual StreamResult Write(const void* data, size_t data_len,
-                             size_t* written, int* error) {
+
+  StreamResult Write(const void* data,
+                     size_t data_len,
+                     size_t* written,
+                     int* error) override {
     if (error)
       *error = -1;
     return SR_ERROR;
   }
-  virtual void Close() { }
-  virtual bool SetPosition(size_t position) {
+
+  void Close() override {}
+
+  bool SetPosition(size_t position) override {
     pos_ = position;
     return true;
   }
-  virtual bool GetPosition(size_t* position) const {
+
+  bool GetPosition(size_t* position) const override {
     if (position) *position = pos_;
     return true;
   }
-  virtual bool GetSize(size_t* size) const {
-    return false;
-  }
-  virtual bool GetAvailable(size_t* size) const {
-    return false;
-  }
+
+  bool GetSize(size_t* size) const override { return false; }
+
+  bool GetAvailable(size_t* size) const override { return false; }
 
  private:
   size_t pos_;
diff --git a/rtc_base/testechoserver.cc b/rtc_base/testechoserver.cc
new file mode 100644
index 0000000..a5eb7de
--- /dev/null
+++ b/rtc_base/testechoserver.cc
@@ -0,0 +1,30 @@
+/*
+ *  Copyright 2017 The WebRTC Project Authors. All rights reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include "rtc_base/testechoserver.h"
+
+namespace rtc {
+
+TestEchoServer::TestEchoServer(Thread* thread, const SocketAddress& addr)
+    : server_socket_(thread->socketserver()->CreateAsyncSocket(addr.family(),
+                                                               SOCK_STREAM)) {
+  server_socket_->Bind(addr);
+  server_socket_->Listen(5);
+  server_socket_->SignalReadEvent.connect(this, &TestEchoServer::OnAccept);
+}
+
+TestEchoServer::~TestEchoServer() {
+  for (ClientList::iterator it = client_sockets_.begin();
+       it != client_sockets_.end(); ++it) {
+    delete *it;
+  }
+}
+
+}  // namespace rtc
diff --git a/rtc_base/testechoserver.h b/rtc_base/testechoserver.h
index 7ef512d..672dda0 100644
--- a/rtc_base/testechoserver.h
+++ b/rtc_base/testechoserver.h
@@ -13,9 +13,9 @@
 
 #include <list>
 #include <memory>
+
 #include "rtc_base/asynctcpsocket.h"
 #include "rtc_base/constructormagic.h"
-#include "rtc_base/sigslot.h"
 #include "rtc_base/socketaddress.h"
 #include "rtc_base/thread.h"
 
@@ -25,19 +25,8 @@
 // Useful for unit tests.
 class TestEchoServer : public sigslot::has_slots<> {
  public:
-  TestEchoServer(Thread* thread, const SocketAddress& addr)
-      : server_socket_(thread->socketserver()->CreateAsyncSocket(addr.family(),
-                                                                 SOCK_STREAM)) {
-    server_socket_->Bind(addr);
-    server_socket_->Listen(5);
-    server_socket_->SignalReadEvent.connect(this, &TestEchoServer::OnAccept);
-  }
-  ~TestEchoServer() {
-    for (ClientList::iterator it = client_sockets_.begin();
-         it != client_sockets_.end(); ++it) {
-      delete *it;
-    }
-  }
+  TestEchoServer(Thread* thread, const SocketAddress& addr);
+  ~TestEchoServer() override;
 
   SocketAddress address() const { return server_socket_->GetLocalAddress(); }
 
diff --git a/rtc_base/testutils.cc b/rtc_base/testutils.cc
new file mode 100644
index 0000000..53fb03e
--- /dev/null
+++ b/rtc_base/testutils.cc
@@ -0,0 +1,117 @@
+/*
+ *  Copyright 2007 The WebRTC Project Authors. All rights reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include "rtc_base/testutils.h"
+
+namespace webrtc {
+namespace testing {
+
+StreamSink::StreamSink() = default;
+
+StreamSink::~StreamSink() = default;
+
+StreamSource::StreamSource() {
+  Clear();
+}
+
+StreamSource::~StreamSource() = default;
+
+StreamState StreamSource::GetState() const {
+  return state_;
+}
+
+StreamResult StreamSource::Read(void* buffer,
+                                size_t buffer_len,
+                                size_t* read,
+                                int* error) {
+  if (SS_CLOSED == state_) {
+    if (error)
+      *error = -1;
+    return SR_ERROR;
+  }
+  if ((SS_OPENING == state_) || (readable_data_.size() <= read_block_)) {
+    return SR_BLOCK;
+  }
+  size_t count = std::min(buffer_len, readable_data_.size() - read_block_);
+  memcpy(buffer, &readable_data_[0], count);
+  size_t new_size = readable_data_.size() - count;
+  // Avoid undefined access beyond the last element of the vector.
+  // This only happens when new_size is 0.
+  if (count < readable_data_.size()) {
+    memmove(&readable_data_[0], &readable_data_[count], new_size);
+  }
+  readable_data_.resize(new_size);
+  if (read)
+    *read = count;
+  return SR_SUCCESS;
+}
+
+StreamResult StreamSource::Write(const void* data,
+                                 size_t data_len,
+                                 size_t* written,
+                                 int* error) {
+  if (SS_CLOSED == state_) {
+    if (error)
+      *error = -1;
+    return SR_ERROR;
+  }
+  if (SS_OPENING == state_) {
+    return SR_BLOCK;
+  }
+  if (SIZE_UNKNOWN != write_block_) {
+    if (written_data_.size() >= write_block_) {
+      return SR_BLOCK;
+    }
+    if (data_len > (write_block_ - written_data_.size())) {
+      data_len = write_block_ - written_data_.size();
+    }
+  }
+  if (written)
+    *written = data_len;
+  const char* cdata = static_cast<const char*>(data);
+  written_data_.insert(written_data_.end(), cdata, cdata + data_len);
+  return SR_SUCCESS;
+}
+
+void StreamSource::Close() {
+  state_ = SS_CLOSED;
+}
+
+SocketTestClient::SocketTestClient() {
+  Init(nullptr, AF_INET);
+}
+
+SocketTestClient::SocketTestClient(AsyncSocket* socket) {
+  Init(socket, socket->GetLocalAddress().family());
+}
+
+SocketTestClient::SocketTestClient(const SocketAddress& address) {
+  Init(nullptr, address.family());
+  socket_->Connect(address);
+}
+
+SocketTestClient::~SocketTestClient() = default;
+
+
+SocketTestServer::SocketTestServer(const SocketAddress& address)
+    : socket_(
+          Thread::Current()->socketserver()->CreateAsyncSocket(address.family(),
+                                                               SOCK_STREAM)) {
+  socket_->SignalReadEvent.connect(this, &SocketTestServer::OnReadEvent);
+  socket_->Bind(address);
+  socket_->Listen(5);
+}
+
+SocketTestServer::~SocketTestServer() {
+  clear();
+}
+
+}  // namespace testing
+}  // namespace webrtc
diff --git a/rtc_base/testutils.h b/rtc_base/testutils.h
index e054880..1c4a6b3 100644
--- a/rtc_base/testutils.h
+++ b/rtc_base/testutils.h
@@ -60,6 +60,9 @@
 
 class StreamSink : public sigslot::has_slots<> {
  public:
+  StreamSink();
+  ~StreamSink() override;
+
   void Monitor(StreamInterface* stream) {
    stream->SignalEvent.connect(this, &StreamSink::OnEvent);
    events_.erase(stream);
@@ -159,16 +162,15 @@
 
 class StreamSource : public StreamInterface {
 public:
-  StreamSource() {
-    Clear();
-  }
+ StreamSource();
+ ~StreamSource() override;
 
-  void Clear() {
-    readable_data_.clear();
-    written_data_.clear();
-    state_ = SS_CLOSED;
-    read_block_ = 0;
-    write_block_ = SIZE_UNKNOWN;
+ void Clear() {
+   readable_data_.clear();
+   written_data_.clear();
+   state_ = SS_CLOSED;
+   read_block_ = 0;
+   write_block_ = SIZE_UNKNOWN;
   }
   void QueueString(const char* data) {
     QueueData(data, strlen(data));
@@ -217,53 +219,18 @@
   // Will cause Write to block when there are pos bytes in the write queue.
   void SetWriteBlock(size_t pos) { write_block_ = pos; }
 
-  virtual StreamState GetState() const { return state_; }
-  virtual StreamResult Read(void* buffer, size_t buffer_len,
-                            size_t* read, int* error) {
-    if (SS_CLOSED == state_) {
-      if (error) *error = -1;
-      return SR_ERROR;
-    }
-    if ((SS_OPENING == state_) || (readable_data_.size() <= read_block_)) {
-      return SR_BLOCK;
-    }
-    size_t count = std::min(buffer_len, readable_data_.size() - read_block_);
-    memcpy(buffer, &readable_data_[0], count);
-    size_t new_size = readable_data_.size() - count;
-    // Avoid undefined access beyond the last element of the vector.
-    // This only happens when new_size is 0.
-    if (count < readable_data_.size()) {
-      memmove(&readable_data_[0], &readable_data_[count], new_size);
-    }
-    readable_data_.resize(new_size);
-    if (read) *read = count;
-    return SR_SUCCESS;
-  }
-  virtual StreamResult Write(const void* data, size_t data_len,
-                             size_t* written, int* error) {
-    if (SS_CLOSED == state_) {
-      if (error) *error = -1;
-      return SR_ERROR;
-    }
-    if (SS_OPENING == state_) {
-      return SR_BLOCK;
-    }
-    if (SIZE_UNKNOWN != write_block_) {
-      if (written_data_.size() >= write_block_) {
-        return SR_BLOCK;
-      }
-      if (data_len > (write_block_ - written_data_.size())) {
-        data_len = write_block_ - written_data_.size();
-      }
-    }
-    if (written) *written = data_len;
-    const char* cdata = static_cast<const char*>(data);
-    written_data_.insert(written_data_.end(), cdata, cdata + data_len);
-    return SR_SUCCESS;
-  }
-  virtual void Close() { state_ = SS_CLOSED; }
+  StreamState GetState() const override;
+  StreamResult Read(void* buffer,
+                    size_t buffer_len,
+                    size_t* read,
+                    int* error) override;
+  StreamResult Write(const void* data,
+                     size_t data_len,
+                     size_t* written,
+                     int* error) override;
+  void Close() override;
 
-private:
+ private:
   typedef std::vector<char> Buffer;
   Buffer readable_data_, written_data_;
   StreamState state_;
@@ -277,28 +244,22 @@
 
 class SocketTestClient : public sigslot::has_slots<> {
 public:
- SocketTestClient() { Init(nullptr, AF_INET); }
- SocketTestClient(AsyncSocket* socket) {
-   Init(socket, socket->GetLocalAddress().family());
-  }
-  SocketTestClient(const SocketAddress& address) {
-    Init(nullptr, address.family());
-    socket_->Connect(address);
-  }
+ SocketTestClient();
+ SocketTestClient(AsyncSocket* socket);
+ SocketTestClient(const SocketAddress& address);
+ ~SocketTestClient() override;
 
-  AsyncSocket* socket() { return socket_.get(); }
+ AsyncSocket* socket() { return socket_.get(); }
 
-  void QueueString(const char* data) {
-    QueueData(data, strlen(data));
-  }
-  void QueueStringF(const char* format, ...) {
-    va_list args;
-    va_start(args, format);
-    char buffer[1024];
-    size_t len = vsprintfn(buffer, sizeof(buffer), format, args);
-    RTC_CHECK(len < sizeof(buffer) - 1);
-    va_end(args);
-    QueueData(buffer, len);
+ void QueueString(const char* data) { QueueData(data, strlen(data)); }
+ void QueueStringF(const char* format, ...) {
+   va_list args;
+   va_start(args, format);
+   char buffer[1024];
+   size_t len = vsprintfn(buffer, sizeof(buffer), format, args);
+   RTC_CHECK(len < sizeof(buffer) - 1);
+   va_end(args);
+   QueueData(buffer, len);
   }
   void QueueData(const char* data, size_t len) {
     send_buffer_.insert(send_buffer_.end(), data, data + len);
@@ -382,17 +343,8 @@
 
 class SocketTestServer : public sigslot::has_slots<> {
  public:
-  SocketTestServer(const SocketAddress& address)
-      : socket_(Thread::Current()->socketserver()
-                ->CreateAsyncSocket(address.family(), SOCK_STREAM))
-  {
-    socket_->SignalReadEvent.connect(this, &SocketTestServer::OnReadEvent);
-    socket_->Bind(address);
-    socket_->Listen(5);
-  }
-  virtual ~SocketTestServer() {
-    clear();
-  }
+  SocketTestServer(const SocketAddress& address);
+  ~SocketTestServer() override;
 
   size_t size() const { return clients_.size(); }
   SocketTestClient* client(size_t index) const { return clients_[index]; }
diff --git a/rtc_base/thread_unittest.cc b/rtc_base/thread_unittest.cc
index dfaa51a..5f00064 100644
--- a/rtc_base/thread_unittest.cc
+++ b/rtc_base/thread_unittest.cc
@@ -44,7 +44,6 @@
 
 struct TestMessage : public MessageData {
   explicit TestMessage(int v) : value(v) {}
-  virtual ~TestMessage() {}
 
   int value;
 };
@@ -60,9 +59,7 @@
     socket_->SignalReadPacket.connect(this, &SocketClient::OnPacket);
   }
 
-  ~SocketClient() {
-    delete socket_;
-  }
+  ~SocketClient() override { delete socket_; }
 
   SocketAddress address() const { return socket_->GetLocalAddress(); }
 
@@ -90,11 +87,9 @@
       : socket_(socket) {
   }
 
-  virtual ~MessageClient() {
-    delete socket_;
-  }
+  ~MessageClient() override { delete socket_; }
 
-  virtual void OnMessage(Message *pmsg) {
+  void OnMessage(Message* pmsg) override {
     TestMessage* msg = static_cast<TestMessage*>(pmsg->pdata);
     int result = Next(msg->value);
     EXPECT_GE(socket_->Send(&result, sizeof(result)), 0);
@@ -109,7 +104,7 @@
  public:
   CustomThread()
       : Thread(std::unique_ptr<SocketServer>(new rtc::NullSocketServer())) {}
-  virtual ~CustomThread() { Stop(); }
+  ~CustomThread() override { Stop(); }
   bool Start() { return false; }
 
   bool WrapCurrent() {
@@ -129,12 +124,12 @@
       : Thread(std::unique_ptr<SocketServer>(new NullSocketServer())),
         event_(event) {}
 
-  virtual ~SignalWhenDestroyedThread() {
+  ~SignalWhenDestroyedThread() override {
     Stop();
     event_->Set();
   }
 
-  virtual void Run() {
+  void Run() override {
     // Do nothing.
   }
 
diff --git a/rtc_base/virtualsocket_unittest.cc b/rtc_base/virtualsocket_unittest.cc
index 785d32c..6081346 100644
--- a/rtc_base/virtualsocket_unittest.cc
+++ b/rtc_base/virtualsocket_unittest.cc
@@ -53,7 +53,7 @@
     return 1000 * size / rate;
   }
 
-  void OnMessage(Message* pmsg) {
+  void OnMessage(Message* pmsg) override {
     ASSERT_EQ(1u, pmsg->message_id);
 
     if (done)
@@ -98,9 +98,7 @@
     thread->PostDelayed(RTC_FROM_HERE, 1000, this, 1);
   }
 
-  ~Receiver() {
-    thread->Clear(this);
-  }
+  ~Receiver() override { thread->Clear(this); }
 
   void OnReadPacket(AsyncPacketSocket* s, const char* data, size_t size,
                     const SocketAddress& remote_addr,
@@ -119,7 +117,7 @@
     samples += 1;
   }
 
-  void OnMessage(Message* pmsg) {
+  void OnMessage(Message* pmsg) override {
     ASSERT_EQ(1u, pmsg->message_id);
 
     if (done)
diff --git a/rtc_base/win32socketserver.cc b/rtc_base/win32socketserver.cc
index 889e495..72d352d 100644
--- a/rtc_base/win32socketserver.cc
+++ b/rtc_base/win32socketserver.cc
@@ -152,9 +152,11 @@
 
   void Dispose();
 
-  virtual bool OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam,
-                         LRESULT& result);
-  virtual void OnNcDestroy();
+  bool OnMessage(UINT uMsg,
+                 WPARAM wParam,
+                 LPARAM lParam,
+                 LRESULT& result) override;
+  void OnNcDestroy() override;
 
  private:
   bool OnSocketNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& result);
@@ -831,4 +833,20 @@
   return handled;
 }
 
+Win32Thread::Win32Thread(SocketServer* ss) : Thread(ss), id_(0) {}
+
+Win32Thread::~Win32Thread() {
+  Stop();
+}
+
+void Win32Thread::Run() {
+  id_ = GetCurrentThreadId();
+  Thread::Run();
+  id_ = 0;
+}
+
+void Win32Thread::Quit() {
+  PostThreadMessage(id_, WM_QUIT, 0, 0);
+}
+
 }  // namespace rtc
diff --git a/rtc_base/win32socketserver.h b/rtc_base/win32socketserver.h
index 63b662c..ce29bc5 100644
--- a/rtc_base/win32socketserver.h
+++ b/rtc_base/win32socketserver.h
@@ -30,7 +30,7 @@
 class Win32Socket : public AsyncSocket {
  public:
   Win32Socket();
-  virtual ~Win32Socket();
+  ~Win32Socket() override;
 
   bool CreateT(int family, int type);
 
@@ -38,25 +38,27 @@
   void SetTimeout(int ms);
 
   // AsyncSocket Interface
-  virtual SocketAddress GetLocalAddress() const;
-  virtual SocketAddress GetRemoteAddress() const;
-  virtual int Bind(const SocketAddress& addr);
-  virtual int Connect(const SocketAddress& addr);
-  virtual int Send(const void *buffer, size_t length);
-  virtual int SendTo(const void *buffer, size_t length, const SocketAddress& addr);
-  virtual int Recv(void* buffer, size_t length, int64_t* timestamp);
-  virtual int RecvFrom(void* buffer,
-                       size_t length,
-                       SocketAddress* out_addr,
-                       int64_t* timestamp);
-  virtual int Listen(int backlog);
-  virtual Win32Socket *Accept(SocketAddress *out_addr);
-  virtual int Close();
-  virtual int GetError() const;
-  virtual void SetError(int error);
-  virtual ConnState GetState() const;
-  virtual int GetOption(Option opt, int* value);
-  virtual int SetOption(Option opt, int value);
+  SocketAddress GetLocalAddress() const override;
+  SocketAddress GetRemoteAddress() const override;
+  int Bind(const SocketAddress& addr) override;
+  int Connect(const SocketAddress& addr) override;
+  int Send(const void* buffer, size_t length) override;
+  int SendTo(const void* buffer,
+             size_t length,
+             const SocketAddress& addr) override;
+  int Recv(void* buffer, size_t length, int64_t* timestamp) override;
+  int RecvFrom(void* buffer,
+               size_t length,
+               SocketAddress* out_addr,
+               int64_t* timestamp) override;
+  int Listen(int backlog) override;
+  Win32Socket* Accept(SocketAddress* out_addr) override;
+  int Close() override;
+  int GetError() const override;
+  void SetError(int error) override;
+  ConnState GetState() const override;
+  int GetOption(Option opt, int* value) override;
+  int SetOption(Option opt, int value) override;
 
  private:
   void CreateSink();
@@ -93,22 +95,22 @@
 class Win32SocketServer : public SocketServer {
  public:
   Win32SocketServer();
-  virtual ~Win32SocketServer();
+  ~Win32SocketServer() override;
 
   void set_modeless_dialog(HWND hdlg) {
     hdlg_ = hdlg;
   }
 
   // SocketServer Interface
-  virtual Socket* CreateSocket(int type);
-  virtual Socket* CreateSocket(int family, int type);
+  Socket* CreateSocket(int type) override;
+  Socket* CreateSocket(int family, int type) override;
 
-  virtual AsyncSocket* CreateAsyncSocket(int type);
-  virtual AsyncSocket* CreateAsyncSocket(int family, int type);
+  AsyncSocket* CreateAsyncSocket(int type) override;
+  AsyncSocket* CreateAsyncSocket(int family, int type) override;
 
-  virtual void SetMessageQueue(MessageQueue* queue);
-  virtual bool Wait(int cms, bool process_io);
-  virtual void WakeUp();
+  void SetMessageQueue(MessageQueue* queue) override;
+  bool Wait(int cms, bool process_io) override;
+  void WakeUp() override;
 
   void Pump();
 
@@ -119,7 +121,7 @@
    public:
     explicit MessageWindow(Win32SocketServer* ss) : ss_(ss) {}
    private:
-    virtual bool OnMessage(UINT msg, WPARAM wp, LPARAM lp, LRESULT& result);
+    bool OnMessage(UINT msg, WPARAM wp, LPARAM lp, LRESULT& result) override;
     Win32SocketServer* ss_;
   };
 
@@ -137,18 +139,12 @@
 
 class Win32Thread : public Thread {
  public:
-  explicit Win32Thread(SocketServer* ss) : Thread(ss),  id_(0) {}
-  virtual ~Win32Thread() {
-    Stop();
-  }
-  virtual void Run() {
-    id_ = GetCurrentThreadId();
-    Thread::Run();
-    id_ = 0;
-  }
-  virtual void Quit() {
-    PostThreadMessage(id_, WM_QUIT, 0, 0);
-  }
+  explicit Win32Thread(SocketServer* ss);
+  ~Win32Thread() override;
+
+  void Run() override;
+  void Quit() override;
+
  private:
   DWORD id_;
 };
diff --git a/rtc_base/win32window.cc b/rtc_base/win32window.cc
index f55a8ba..9e9c839 100644
--- a/rtc_base/win32window.cc
+++ b/rtc_base/win32window.cc
@@ -87,10 +87,20 @@
   return false;
 }
 
-LRESULT Win32Window::WndProc(HWND hwnd, UINT uMsg,
-                             WPARAM wParam, LPARAM lParam) {
-  Win32Window* that = reinterpret_cast<Win32Window*>(
-      ::GetWindowLongPtr(hwnd, GWLP_USERDATA));
+bool Win32Window::OnClose() {
+  return true;
+}
+
+void Win32Window::OnNcDestroy() {
+  // Do nothing. }
+}
+
+LRESULT Win32Window::WndProc(HWND hwnd,
+                             UINT uMsg,
+                             WPARAM wParam,
+                             LPARAM lParam) {
+  Win32Window* that =
+      reinterpret_cast<Win32Window*>(::GetWindowLongPtr(hwnd, GWLP_USERDATA));
   if (!that && (WM_CREATE == uMsg)) {
     CREATESTRUCT* cs = reinterpret_cast<CREATESTRUCT*>(lParam);
     that = static_cast<Win32Window*>(cs->lpCreateParams);
diff --git a/rtc_base/win32window.h b/rtc_base/win32window.h
index c7b7fa9..fa026d1 100644
--- a/rtc_base/win32window.h
+++ b/rtc_base/win32window.h
@@ -39,8 +39,8 @@
   virtual bool OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam,
                          LRESULT& result);
 
-  virtual bool OnClose() { return true; }
-  virtual void OnNcDestroy() { }
+  virtual bool OnClose();
+  virtual void OnNcDestroy();
 
  private:
   static LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam,
diff --git a/rtc_base/win32window_unittest.cc b/rtc_base/win32window_unittest.cc
index f1d8e84..c659349 100644
--- a/rtc_base/win32window_unittest.cc
+++ b/rtc_base/win32window_unittest.cc
@@ -20,17 +20,17 @@
   const MSG& msg() const { return msg_; }
   bool destroyed() const { return destroyed_; }
 
-  virtual bool OnMessage(UINT uMsg, WPARAM wParam,
-                         LPARAM lParam, LRESULT& result) {
+  bool OnMessage(UINT uMsg,
+                 WPARAM wParam,
+                 LPARAM lParam,
+                 LRESULT& result) override {
     msg_.message = uMsg;
     msg_.wParam = wParam;
     msg_.lParam = lParam;
     result = kDummyResult;
     return true;
   }
-  virtual void OnNcDestroy() {
-    destroyed_ = true;
-  }
+  void OnNcDestroy() override { destroyed_ = true; }
 
  private:
   MSG msg_;
