diff --git a/modules/audio_processing/aec3/BUILD.gn b/modules/audio_processing/aec3/BUILD.gn
index d41fee6..1f69eb7 100644
--- a/modules/audio_processing/aec3/BUILD.gn
+++ b/modules/audio_processing/aec3/BUILD.gn
@@ -104,8 +104,6 @@
     "shadow_filter_update_gain.h",
     "signal_dependent_erle_estimator.cc",
     "signal_dependent_erle_estimator.h",
-    "skew_estimator.cc",
-    "skew_estimator.h",
     "stationarity_estimator.cc",
     "stationarity_estimator.h",
     "subband_erle_estimator.cc",
@@ -222,7 +220,6 @@
         "reverb_model_estimator_unittest.cc",
         "shadow_filter_update_gain_unittest.cc",
         "signal_dependent_erle_estimator_unittest.cc",
-        "skew_estimator_unittest.cc",
         "subtractor_unittest.cc",
         "suppression_filter_unittest.cc",
         "suppression_gain_unittest.cc",
diff --git a/modules/audio_processing/aec3/skew_estimator.cc b/modules/audio_processing/aec3/skew_estimator.cc
deleted file mode 100644
index a2099fc..0000000
--- a/modules/audio_processing/aec3/skew_estimator.cc
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright (c) 2018 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 "modules/audio_processing/aec3/skew_estimator.h"
-
-#include <algorithm>
-
-namespace webrtc {
-
-SkewEstimator::SkewEstimator(size_t skew_history_size_log2)
-    : skew_history_size_log2_(static_cast<int>(skew_history_size_log2)),
-      skew_history_(1ULL << skew_history_size_log2_, 0) {}
-
-SkewEstimator::~SkewEstimator() = default;
-
-void SkewEstimator::Reset() {
-  skew_ = 0;
-  skew_sum_ = 0;
-  next_index_ = 0;
-  sufficient_skew_stored_ = false;
-  std::fill(skew_history_.begin(), skew_history_.end(), 0);
-}
-
-absl::optional<int> SkewEstimator::GetSkewFromCapture() {
-  --skew_;
-
-  skew_sum_ += skew_ - skew_history_[next_index_];
-  skew_history_[next_index_] = skew_;
-  if (++next_index_ == skew_history_.size()) {
-    next_index_ = 0;
-    sufficient_skew_stored_ = true;
-  }
-
-  const int bias = static_cast<int>(skew_history_.size()) >> 1;
-  const int average = (skew_sum_ + bias) >> skew_history_size_log2_;
-  return sufficient_skew_stored_ ? absl::optional<int>(average) : absl::nullopt;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/skew_estimator.h b/modules/audio_processing/aec3/skew_estimator.h
deleted file mode 100644
index 8a457cb..0000000
--- a/modules/audio_processing/aec3/skew_estimator.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *  Copyright (c) 2018 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.
- */
-
-#ifndef MODULES_AUDIO_PROCESSING_AEC3_SKEW_ESTIMATOR_H_
-#define MODULES_AUDIO_PROCESSING_AEC3_SKEW_ESTIMATOR_H_
-
-#include <stddef.h>
-#include <vector>
-
-#include "absl/types/optional.h"
-#include "rtc_base/constructor_magic.h"
-
-namespace webrtc {
-
-// Estimator of API call skew between render and capture.
-class SkewEstimator {
- public:
-  explicit SkewEstimator(size_t skew_history_size_log2);
-  ~SkewEstimator();
-
-  // Resets the estimation.
-  void Reset();
-
-  // Updates the skew data for a render call.
-  void LogRenderCall() { ++skew_; }
-
-  // Updates and computes the skew at a capture call. Returns an optional which
-  // is non-null if a reliable skew has been found.
-  absl::optional<int> GetSkewFromCapture();
-
- private:
-  const int skew_history_size_log2_;
-  std::vector<float> skew_history_;
-  int skew_ = 0;
-  int skew_sum_ = 0;
-  size_t next_index_ = 0;
-  bool sufficient_skew_stored_ = false;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(SkewEstimator);
-};
-
-}  // namespace webrtc
-
-#endif  // MODULES_AUDIO_PROCESSING_AEC3_SKEW_ESTIMATOR_H_
diff --git a/modules/audio_processing/aec3/skew_estimator_unittest.cc b/modules/audio_processing/aec3/skew_estimator_unittest.cc
deleted file mode 100644
index 3e8c13e..0000000
--- a/modules/audio_processing/aec3/skew_estimator_unittest.cc
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- *  Copyright (c) 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 "modules/audio_processing/aec3/skew_estimator.h"
-
-#include "test/gtest.h"
-
-namespace webrtc {
-namespace aec3 {
-
-// Tests that the skew ends up as it should after a skew change.
-TEST(SkewEstimator, SkewChangeAdaptation) {
-  constexpr int kNumSkewsLog2 = 7;
-  constexpr int kNumSkews = 1 << kNumSkewsLog2;
-
-  SkewEstimator estimator(kNumSkewsLog2);
-
-  for (int k = 0; k < kNumSkews - 1; ++k) {
-    estimator.LogRenderCall();
-    auto skew = estimator.GetSkewFromCapture();
-    EXPECT_FALSE(skew);
-  }
-
-  estimator.LogRenderCall();
-
-  absl::optional<int> skew;
-  for (int k = 0; k < kNumSkews; ++k) {
-    estimator.LogRenderCall();
-    skew = estimator.GetSkewFromCapture();
-    EXPECT_TRUE(skew);
-  }
-  EXPECT_EQ(1, *skew);
-
-  estimator.LogRenderCall();
-
-  for (int k = 0; k < kNumSkews; ++k) {
-    estimator.LogRenderCall();
-    skew = estimator.GetSkewFromCapture();
-    EXPECT_TRUE(skew);
-  }
-  EXPECT_EQ(2, *skew);
-}
-
-// Tests that the skew ends up as it should for a surplus of render calls.
-TEST(SkewEstimator, SkewForSurplusRender) {
-  constexpr int kNumSkewsLog2 = 7;
-  constexpr int kNumSkews = 1 << kNumSkewsLog2;
-
-  SkewEstimator estimator(kNumSkewsLog2);
-
-  for (int k = 0; k < kNumSkews - 1; ++k) {
-    estimator.LogRenderCall();
-    auto skew = estimator.GetSkewFromCapture();
-    EXPECT_FALSE(skew);
-  }
-
-  estimator.LogRenderCall();
-
-  absl::optional<int> skew;
-  for (int k = 0; k < kNumSkews; ++k) {
-    estimator.LogRenderCall();
-    skew = estimator.GetSkewFromCapture();
-    EXPECT_TRUE(skew);
-  }
-  EXPECT_EQ(1, *skew);
-}
-
-// Tests that the skew ends up as it should for a surplus of capture calls.
-TEST(SkewEstimator, SkewForSurplusCapture) {
-  constexpr int kNumSkewsLog2 = 7;
-  constexpr int kNumSkews = 1 << kNumSkewsLog2;
-
-  SkewEstimator estimator(kNumSkewsLog2);
-
-  for (int k = 0; k < kNumSkews - 1; ++k) {
-    estimator.LogRenderCall();
-    auto skew = estimator.GetSkewFromCapture();
-    EXPECT_FALSE(skew);
-  }
-
-  absl::optional<int> skew;
-  skew = estimator.GetSkewFromCapture();
-
-  for (int k = 0; k < kNumSkews; ++k) {
-    estimator.LogRenderCall();
-    skew = estimator.GetSkewFromCapture();
-    EXPECT_TRUE(skew);
-  }
-  EXPECT_EQ(-1, *skew);
-}
-
-// Tests that the skew estimator returns a null optional when it should.
-TEST(SkewEstimator, NullEstimate) {
-  constexpr int kNumSkewsLog2 = 4;
-  constexpr int kNumSkews = 1 << kNumSkewsLog2;
-
-  SkewEstimator estimator(kNumSkewsLog2);
-
-  for (int k = 0; k < kNumSkews - 1; ++k) {
-    estimator.LogRenderCall();
-    auto skew = estimator.GetSkewFromCapture();
-    EXPECT_FALSE(skew);
-  }
-
-  estimator.LogRenderCall();
-  auto skew = estimator.GetSkewFromCapture();
-  EXPECT_TRUE(skew);
-
-  estimator.Reset();
-  for (int k = 0; k < kNumSkews - 1; ++k) {
-    estimator.LogRenderCall();
-    auto skew = estimator.GetSkewFromCapture();
-    EXPECT_FALSE(skew);
-  }
-}
-
-// Tests that the skew estimator properly rounds the average skew.
-TEST(SkewEstimator, SkewRounding) {
-  constexpr int kNumSkewsLog2 = 4;
-  constexpr int kNumSkews = 1 << kNumSkewsLog2;
-
-  SkewEstimator estimator(kNumSkewsLog2);
-
-  absl::optional<int> skew;
-  for (int k = 0; k < kNumSkews; ++k) {
-    if (k == kNumSkews - 1) {
-      // Reverse call order once.
-      skew = estimator.GetSkewFromCapture();
-      estimator.LogRenderCall();
-    } else {
-      // Normal call order.
-      estimator.LogRenderCall();
-      skew = estimator.GetSkewFromCapture();
-    }
-  }
-  EXPECT_EQ(*skew, 0);
-
-  estimator.Reset();
-  for (int k = 0; k < kNumSkews; ++k) {
-    estimator.LogRenderCall();
-    estimator.LogRenderCall();
-    estimator.LogRenderCall();
-    estimator.GetSkewFromCapture();
-    estimator.GetSkewFromCapture();
-    skew = estimator.GetSkewFromCapture();
-  }
-  EXPECT_EQ(*skew, 1);
-}
-}  // namespace aec3
-}  // namespace webrtc
