diff --git a/voice_engine/BUILD.gn b/voice_engine/BUILD.gn
index 31cdff8..17c33ff 100644
--- a/voice_engine/BUILD.gn
+++ b/voice_engine/BUILD.gn
@@ -78,7 +78,6 @@
     "include/voe_codec.h",
     "include/voe_errors.h",
     "include/voe_file.h",
-    "include/voe_hardware.h",
     "include/voe_network.h",
     "include/voe_rtp_rtcp.h",
     "monitor_module.h",
@@ -100,8 +99,6 @@
     "voe_codec_impl.h",
     "voe_file_impl.cc",
     "voe_file_impl.h",
-    "voe_hardware_impl.cc",
-    "voe_hardware_impl.h",
     "voe_network_impl.cc",
     "voe_network_impl.h",
     "voe_rtp_rtcp_impl.cc",
@@ -272,8 +269,6 @@
         "test/auto_test/standard/dtmf_test.cc",
         "test/auto_test/standard/file_before_streaming_test.cc",
         "test/auto_test/standard/file_test.cc",
-        "test/auto_test/standard/hardware_before_initializing_test.cc",
-        "test/auto_test/standard/hardware_test.cc",
         "test/auto_test/standard/mixing_test.cc",
         "test/auto_test/standard/rtp_rtcp_before_streaming_test.cc",
         "test/auto_test/standard/rtp_rtcp_extensions.cc",
@@ -285,12 +280,6 @@
         "test/auto_test/voe_test_defines.h",
       ]
 
-      if (!is_android) {
-        # Some tests are not supported on android yet, exclude these tests.
-        sources +=
-            [ "test/auto_test/standard/hardware_before_streaming_test.cc" ]
-      }
-
       defines = []
 
       if (rtc_enable_protobuf) {
diff --git a/voice_engine/include/voe_hardware.h b/voice_engine/include/voe_hardware.h
deleted file mode 100644
index fcf009d..0000000
--- a/voice_engine/include/voe_hardware.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-// This sub-API supports the following functionalities:
-//
-//  - Audio device handling.
-//  - Device information.
-//  - CPU load monitoring.
-//
-// Usage example, omitting error checking:
-//
-//  using namespace webrtc;
-//  VoiceEngine* voe = VoiceEngine::Create();
-//  VoEBase* base = VoEBase::GetInterface(voe);
-//  VoEHardware* hardware  = VoEHardware::GetInterface(voe);
-//  base->Init();
-//  ...
-//  int n_devices = hardware->GetNumOfPlayoutDevices();
-//  ...
-//  base->Terminate();
-//  base->Release();
-//  hardware->Release();
-//  VoiceEngine::Delete(voe);
-//
-#ifndef WEBRTC_VOICE_ENGINE_VOE_HARDWARE_H
-#define WEBRTC_VOICE_ENGINE_VOE_HARDWARE_H
-
-#include "webrtc/common_types.h"
-
-namespace webrtc {
-
-class VoiceEngine;
-
-class WEBRTC_DLLEXPORT VoEHardware {
- public:
-  // Factory for the VoEHardware sub-API. Increases an internal
-  // reference counter if successful. Returns NULL if the API is not
-  // supported or if construction fails.
-  static VoEHardware* GetInterface(VoiceEngine* voiceEngine);
-
-  // Releases the VoEHardware sub-API and decreases an internal
-  // reference counter. Returns the new reference count. This value should
-  // be zero for all sub-API:s before the VoiceEngine object can be safely
-  // deleted.
-  virtual int Release() = 0;
-
-  // Gets the number of audio devices available for recording.
-  virtual int GetNumOfRecordingDevices(int& devices) = 0;
-
-  // Gets the number of audio devices available for playout.
-  virtual int GetNumOfPlayoutDevices(int& devices) = 0;
-
-  // Gets the name of a specific recording device given by an |index|.
-  // On Windows Vista/7, it also retrieves an additional unique ID
-  // (GUID) for the recording device.
-  virtual int GetRecordingDeviceName(int index,
-                                     char strNameUTF8[128],
-                                     char strGuidUTF8[128]) = 0;
-
-  // Gets the name of a specific playout device given by an |index|.
-  // On Windows Vista/7, it also retrieves an additional unique ID
-  // (GUID) for the playout device.
-  virtual int GetPlayoutDeviceName(int index,
-                                   char strNameUTF8[128],
-                                   char strGuidUTF8[128]) = 0;
-
-  // Sets the audio device used for recording.
-  virtual int SetRecordingDevice(
-      int index,
-      StereoChannel recordingChannel = kStereoBoth) = 0;
-
-  // Sets the audio device used for playout.
-  virtual int SetPlayoutDevice(int index) = 0;
-
-  // Sets the type of audio device layer to use.
-  virtual int SetAudioDeviceLayer(AudioLayers audioLayer) = 0;
-
-  // Gets the currently used (active) audio device layer.
-  virtual int GetAudioDeviceLayer(AudioLayers& audioLayer) = 0;
-
-  // Native sample rate controls (samples/sec)
-  virtual int SetRecordingSampleRate(unsigned int samples_per_sec) = 0;
-  virtual int RecordingSampleRate(unsigned int* samples_per_sec) const = 0;
-  virtual int SetPlayoutSampleRate(unsigned int samples_per_sec) = 0;
-  virtual int PlayoutSampleRate(unsigned int* samples_per_sec) const = 0;
-
-  // Queries and controls platform audio effects on Android devices.
-  virtual bool BuiltInAECIsAvailable() const = 0;
-  virtual int EnableBuiltInAEC(bool enable) = 0;
-  virtual bool BuiltInAGCIsAvailable() const = 0;
-  virtual int EnableBuiltInAGC(bool enable) = 0;
-  virtual bool BuiltInNSIsAvailable() const = 0;
-  virtual int EnableBuiltInNS(bool enable) = 0;
-
- protected:
-  VoEHardware() {}
-  virtual ~VoEHardware() {}
-};
-
-}  // namespace webrtc
-
-#endif  //  WEBRTC_VOICE_ENGINE_VOE_HARDWARE_H
diff --git a/voice_engine/shared_data.cc b/voice_engine/shared_data.cc
index 41e261b..57a1a59 100644
--- a/voice_engine/shared_data.cc
+++ b/voice_engine/shared_data.cc
@@ -40,7 +40,6 @@
                                                 _engineStatistics,
                                                 _channelManager);
     }
-    _audioDeviceLayer = AudioDeviceModule::kPlatformDefaultAudio;
 }
 
 SharedData::~SharedData()
diff --git a/voice_engine/shared_data.h b/voice_engine/shared_data.h
index 0e57f9d..e301419 100644
--- a/voice_engine/shared_data.h
+++ b/voice_engine/shared_data.h
@@ -46,12 +46,6 @@
     OutputMixer* output_mixer() { return _outputMixerPtr; }
     rtc::CriticalSection* crit_sec() { return &_apiCritPtr; }
     ProcessThread* process_thread() { return _moduleProcessThreadPtr.get(); }
-    AudioDeviceModule::AudioLayer audio_device_layer() const {
-      return _audioDeviceLayer;
-    }
-    void set_audio_device_layer(AudioDeviceModule::AudioLayer layer) {
-      _audioDeviceLayer = layer;
-    }
 
     int NumOfSendingChannels();
     int NumOfPlayingChannels();
@@ -73,8 +67,6 @@
     std::unique_ptr<AudioProcessing> audioproc_;
     std::unique_ptr<ProcessThread> _moduleProcessThreadPtr;
 
-    AudioDeviceModule::AudioLayer _audioDeviceLayer;
-
     SharedData();
     virtual ~SharedData();
 };
diff --git a/voice_engine/test/auto_test/fixtures/before_initialization_fixture.cc b/voice_engine/test/auto_test/fixtures/before_initialization_fixture.cc
index 9529394..acfc150 100644
--- a/voice_engine/test/auto_test/fixtures/before_initialization_fixture.cc
+++ b/voice_engine/test/auto_test/fixtures/before_initialization_fixture.cc
@@ -21,7 +21,6 @@
   voe_rtp_rtcp_ = webrtc::VoERTP_RTCP::GetInterface(voice_engine_);
   voe_network_ = webrtc::VoENetwork::GetInterface(voice_engine_);
   voe_file_ = webrtc::VoEFile::GetInterface(voice_engine_);
-  voe_hardware_ = webrtc::VoEHardware::GetInterface(voice_engine_);
 }
 
 BeforeInitializationFixture::~BeforeInitializationFixture() {
@@ -30,7 +29,6 @@
   voe_rtp_rtcp_->Release();
   voe_network_->Release();
   voe_file_->Release();
-  voe_hardware_->Release();
 
   EXPECT_TRUE(webrtc::VoiceEngine::Delete(voice_engine_));
 }
diff --git a/voice_engine/test/auto_test/fixtures/before_initialization_fixture.h b/voice_engine/test/auto_test/fixtures/before_initialization_fixture.h
index 073ff44..ce35141 100644
--- a/voice_engine/test/auto_test/fixtures/before_initialization_fixture.h
+++ b/voice_engine/test/auto_test/fixtures/before_initialization_fixture.h
@@ -19,7 +19,6 @@
 #include "webrtc/voice_engine/include/voe_codec.h"
 #include "webrtc/voice_engine/include/voe_errors.h"
 #include "webrtc/voice_engine/include/voe_file.h"
-#include "webrtc/voice_engine/include/voe_hardware.h"
 #include "webrtc/voice_engine/include/voe_network.h"
 #include "webrtc/voice_engine/include/voe_rtp_rtcp.h"
 #include "webrtc/voice_engine/test/auto_test/voe_test_common.h"
@@ -50,7 +49,6 @@
   webrtc::VoERTP_RTCP*        voe_rtp_rtcp_;
   webrtc::VoENetwork*         voe_network_;
   webrtc::VoEFile*            voe_file_;
-  webrtc::VoEHardware*        voe_hardware_;
 };
 
 #endif  // SRC_VOICE_ENGINE_MAIN_TEST_AUTO_TEST_STANDARD_TEST_BASE_H_
diff --git a/voice_engine/test/auto_test/standard/hardware_before_initializing_test.cc b/voice_engine/test/auto_test/standard/hardware_before_initializing_test.cc
deleted file mode 100644
index 976b805..0000000
--- a/voice_engine/test/auto_test/standard/hardware_before_initializing_test.cc
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- *  Copyright (c) 2011 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 "webrtc/common_types.h"
-#include "webrtc/voice_engine/test/auto_test/fixtures/before_initialization_fixture.h"
-
-using namespace webrtc;
-
-class HardwareBeforeInitializingTest : public BeforeInitializationFixture {
-};
-
-TEST_F(HardwareBeforeInitializingTest,
-       SetAudioDeviceLayerAcceptsPlatformDefaultBeforeInitializing) {
-  AudioLayers wanted_layer = kAudioPlatformDefault;
-  AudioLayers given_layer;
-  EXPECT_EQ(0, voe_hardware_->SetAudioDeviceLayer(wanted_layer));
-  EXPECT_EQ(0, voe_hardware_->GetAudioDeviceLayer(given_layer));
-  EXPECT_EQ(wanted_layer, given_layer) <<
-      "These should be the same before initializing.";
-}
diff --git a/voice_engine/test/auto_test/standard/hardware_before_streaming_test.cc b/voice_engine/test/auto_test/standard/hardware_before_streaming_test.cc
deleted file mode 100644
index a5c13b4..0000000
--- a/voice_engine/test/auto_test/standard/hardware_before_streaming_test.cc
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- *  Copyright (c) 2011 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 <string.h>
-
-#include "webrtc/voice_engine/test/auto_test/fixtures/after_initialization_fixture.h"
-
-using namespace webrtc;
-
-class HardwareBeforeStreamingTest : public AfterInitializationFixture {
-};
-
-// Tests that apply to both mobile and desktop:
-
-TEST_F(HardwareBeforeStreamingTest,
-       SetAudioDeviceLayerFailsSinceTheVoiceEngineHasBeenInitialized) {
-  EXPECT_NE(0, voe_hardware_->SetAudioDeviceLayer(kAudioPlatformDefault));
-  EXPECT_EQ(VE_ALREADY_INITED, voe_base_->LastError());
-}
-
-// Tests that only apply to desktop:
-#if !defined(WEBRTC_IOS) & !defined(WEBRTC_ANDROID)
-
-static const char* kNoDevicesErrorMessage =
-    "Either you have no recording / playout device "
-    "on your system, or the method failed.";
-
-  // Win, Mac and Linux sound device tests.
-TEST_F(HardwareBeforeStreamingTest,
-       GetRecordingDeviceNameRetrievesDeviceNames) {
-  char device_name[128] = {0};
-  char guid_name[128] = {0};
-
-#ifdef _WIN32
-  EXPECT_EQ(0, voe_hardware_->GetRecordingDeviceName(
-      -1, device_name, guid_name));
-  EXPECT_GT(strlen(device_name), 0u) << kNoDevicesErrorMessage;
-  device_name[0] = '\0';
-
-  EXPECT_EQ(0, voe_hardware_->GetPlayoutDeviceName(
-      -1, device_name, guid_name));
-  EXPECT_GT(strlen(device_name), 0u) << kNoDevicesErrorMessage;
-
-#else
-  EXPECT_EQ(0, voe_hardware_->GetRecordingDeviceName(
-      0, device_name, guid_name));
-  EXPECT_GT(strlen(device_name), 0u) << kNoDevicesErrorMessage;
-  device_name[0] = '\0';
-
-  EXPECT_EQ(0, voe_hardware_->GetPlayoutDeviceName(
-      0, device_name, guid_name));
-  EXPECT_GT(strlen(device_name), 0u) << kNoDevicesErrorMessage;
-#endif  // !WIN32
-}
-
-TEST_F(HardwareBeforeStreamingTest,
-       AllEnumeratedRecordingDevicesCanBeSetAsRecordingDevice) {
-  // Check recording side.
-  // Extended Win32 enumeration tests: unique GUID outputs on Vista and up:
-  // Win XP and below : device_name is copied to guid_name.
-  // Win Vista and up : device_name is the friendly name and GUID is a unique
-  //                    identifier.
-  // Other            : guid_name is left unchanged.
-  int num_of_recording_devices = 0;
-  EXPECT_EQ(0, voe_hardware_->GetNumOfRecordingDevices(
-      num_of_recording_devices));
-  EXPECT_GT(num_of_recording_devices, 0) << kNoDevicesErrorMessage;
-
-  char device_name[128] = {0};
-  char guid_name[128] = {0};
-
-  for (int i = 0; i < num_of_recording_devices; i++) {
-    EXPECT_EQ(0, voe_hardware_->GetRecordingDeviceName(
-        i, device_name, guid_name));
-    EXPECT_GT(strlen(device_name), 0u) <<
-        "There should be no empty device names "
-        "among the ones the system gives us.";
-    EXPECT_EQ(0, voe_hardware_->SetRecordingDevice(i));
-  }
-}
-
-TEST_F(HardwareBeforeStreamingTest,
-       AllEnumeratedPlayoutDevicesCanBeSetAsPlayoutDevice) {
-  // Check playout side (see recording side test for more info on GUIDs).
-  int num_of_playout_devices = 0;
-  EXPECT_EQ(0, voe_hardware_->GetNumOfPlayoutDevices(
-      num_of_playout_devices));
-  EXPECT_GT(num_of_playout_devices, 0) << kNoDevicesErrorMessage;
-
-  char device_name[128] = {0};
-  char guid_name[128] = {0};
-
-  for (int i = 0; i < num_of_playout_devices; ++i) {
-    EXPECT_EQ(0, voe_hardware_->GetPlayoutDeviceName(
-        i, device_name, guid_name));
-    EXPECT_GT(strlen(device_name), 0u) <<
-        "There should be no empty device names "
-        "among the ones the system gives us.";
-    EXPECT_EQ(0, voe_hardware_->SetPlayoutDevice(i));
-  }
-}
-
-TEST_F(HardwareBeforeStreamingTest,
-       SetDeviceWithMagicalArgumentsSetsDefaultSoundDevices) {
-#ifdef _WIN32
-  // -1 means "default device" on Windows.
-  EXPECT_EQ(0, voe_hardware_->SetRecordingDevice(-1));
-  EXPECT_EQ(0, voe_hardware_->SetPlayoutDevice(-1));
-#else
-  EXPECT_EQ(0, voe_hardware_->SetRecordingDevice(0));
-  EXPECT_EQ(0, voe_hardware_->SetPlayoutDevice(0));
-#endif
-}
-
-#endif // !defined(WEBRTC_IOS) & !defined(WEBRTC_ANDROID)
diff --git a/voice_engine/test/auto_test/standard/hardware_test.cc b/voice_engine/test/auto_test/standard/hardware_test.cc
deleted file mode 100644
index a9e5f0f..0000000
--- a/voice_engine/test/auto_test/standard/hardware_test.cc
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *  Copyright (c) 2011 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 "webrtc/modules/audio_device/include/audio_device.h"
-#include "webrtc/voice_engine/test/auto_test/fixtures/after_streaming_fixture.h"
-
-class HardwareTest : public AfterStreamingFixture {
-};
-
-#if !defined(WEBRTC_IOS) && !defined(WEBRTC_ANDROID)
-TEST_F(HardwareTest, AbleToQueryForDevices) {
-  int num_recording_devices = 0;
-  int num_playout_devices = 0;
-  EXPECT_EQ(0, voe_hardware_->GetNumOfRecordingDevices(num_recording_devices));
-  EXPECT_EQ(0, voe_hardware_->GetNumOfPlayoutDevices(num_playout_devices));
-
-  ASSERT_GT(num_recording_devices, 0) <<
-      "There seem to be no recording devices on your system, "
-      "and this test really doesn't make sense then.";
-  ASSERT_GT(num_playout_devices, 0) <<
-      "There seem to be no playout devices on your system, "
-      "and this test really doesn't make sense then.";
-
-  // Recording devices are handled a bit differently on Windows - we can
-  // just tell it to set the 'default' communication device there.
-#ifdef _WIN32
-  // Should also work while already recording.
-  EXPECT_EQ(0, voe_hardware_->SetRecordingDevice(
-      webrtc::AudioDeviceModule::kDefaultCommunicationDevice));
-  // Should also work while already playing.
-  EXPECT_EQ(0, voe_hardware_->SetPlayoutDevice(
-      webrtc::AudioDeviceModule::kDefaultCommunicationDevice));
-#else
-  // For other platforms, just use the first device encountered.
-  EXPECT_EQ(0, voe_hardware_->SetRecordingDevice(0));
-  EXPECT_EQ(0, voe_hardware_->SetPlayoutDevice(0));
-#endif
-
-  // It's hard to know what names this will return (it's system-dependent),
-  // so just check that it's possible to do it.
-  char device_name[128] = {0};
-  char guid_name[128] = {0};
-  EXPECT_EQ(0, voe_hardware_->GetRecordingDeviceName(
-      0, device_name, guid_name));
-  EXPECT_EQ(0, voe_hardware_->GetPlayoutDeviceName(
-      0, device_name, guid_name));
-}
-#endif
diff --git a/voice_engine/test/auto_test/voe_test_defines.h b/voice_engine/test/auto_test/voe_test_defines.h
index 0f3cfe6..7264ffe 100644
--- a/voice_engine/test/auto_test/voe_test_defines.h
+++ b/voice_engine/test/auto_test/voe_test_defines.h
@@ -18,19 +18,10 @@
 // settings in voice_engine_configurations.h.
 #define _TEST_BASE_
 #define _TEST_RTP_RTCP_
-#define _TEST_HARDWARE_
 #define _TEST_CODEC_
 #define _TEST_FILE_
 #define _TEST_NETWORK_
 
-#define TESTED_AUDIO_LAYER kAudioPlatformDefault
-//#define TESTED_AUDIO_LAYER kAudioLinuxPulse
-
-// #define _ENABLE_VISUAL_LEAK_DETECTOR_ // Enables VLD to find memory leaks
-// #define _ENABLE_IPV6_TESTS_      // Enables IPv6 tests in network xtest
-// #define _USE_EXTENDED_TRACE_     // Adds unique trace files for extended test
-// #define _MEMORY_TEST_
-
 // Enable this when running instrumentation of some kind to exclude tests
 // that will not pass due to slowed down execution.
 // #define _INSTRUMENTATION_TESTING_
diff --git a/voice_engine/voe_base_impl.cc b/voice_engine/voe_base_impl.cc
index 95a30d0..d1981a4 100644
--- a/voice_engine/voe_base_impl.cc
+++ b/voice_engine/voe_base_impl.cc
@@ -196,8 +196,8 @@
 #else
     // Create the internal ADM implementation.
     shared_->set_audio_device(AudioDeviceModule::Create(
-        VoEId(shared_->instance_id(), -1), shared_->audio_device_layer()));
-
+        VoEId(shared_->instance_id(), -1),
+        AudioDeviceModule::kPlatformDefaultAudio));
     if (shared_->audio_device() == nullptr) {
       shared_->SetLastError(VE_NO_MEMORY, kTraceCritical,
                             "Init() failed to create the ADM");
diff --git a/voice_engine/voe_codec_unittest.cc b/voice_engine/voe_codec_unittest.cc
index c095614..af04a61 100644
--- a/voice_engine/voe_codec_unittest.cc
+++ b/voice_engine/voe_codec_unittest.cc
@@ -15,7 +15,6 @@
 #include "webrtc/modules/audio_device/include/fake_audio_device.h"
 #include "webrtc/test/gtest.h"
 #include "webrtc/voice_engine/include/voe_base.h"
-#include "webrtc/voice_engine/include/voe_hardware.h"
 #include "webrtc/voice_engine/voice_engine_defines.h"
 
 namespace webrtc {
diff --git a/voice_engine/voe_hardware_impl.cc b/voice_engine/voe_hardware_impl.cc
deleted file mode 100644
index db47c73..0000000
--- a/voice_engine/voe_hardware_impl.cc
+++ /dev/null
@@ -1,502 +0,0 @@
-/*
- *  Copyright (c) 2012 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 "webrtc/voice_engine/voe_hardware_impl.h"
-
-#include <assert.h>
-
-#include "webrtc/system_wrappers/include/trace.h"
-#include "webrtc/voice_engine/include/voe_errors.h"
-#include "webrtc/voice_engine/voice_engine_impl.h"
-
-namespace webrtc {
-
-VoEHardware* VoEHardware::GetInterface(VoiceEngine* voiceEngine) {
-  if (NULL == voiceEngine) {
-    return NULL;
-  }
-  VoiceEngineImpl* s = static_cast<VoiceEngineImpl*>(voiceEngine);
-  s->AddRef();
-  return s;
-}
-
-VoEHardwareImpl::VoEHardwareImpl(voe::SharedData* shared) : _shared(shared) {
-  WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "VoEHardwareImpl() - ctor");
-}
-
-VoEHardwareImpl::~VoEHardwareImpl() {
-  WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "~VoEHardwareImpl() - dtor");
-}
-
-int VoEHardwareImpl::SetAudioDeviceLayer(AudioLayers audioLayer) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "SetAudioDeviceLayer(audioLayer=%d)", audioLayer);
-
-  // Don't allow a change if VoE is initialized
-  if (_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_ALREADY_INITED, kTraceError);
-    return -1;
-  }
-
-  // Map to AudioDeviceModule::AudioLayer
-  AudioDeviceModule::AudioLayer wantedLayer(
-      AudioDeviceModule::kPlatformDefaultAudio);
-  switch (audioLayer) {
-    case kAudioPlatformDefault:
-      // already set above
-      break;
-    case kAudioWindowsCore:
-      wantedLayer = AudioDeviceModule::kWindowsCoreAudio;
-      break;
-    case kAudioLinuxAlsa:
-      wantedLayer = AudioDeviceModule::kLinuxAlsaAudio;
-      break;
-    case kAudioLinuxPulse:
-      wantedLayer = AudioDeviceModule::kLinuxPulseAudio;
-      break;
-  }
-
-  // Save the audio device layer for Init()
-  _shared->set_audio_device_layer(wantedLayer);
-
-  return 0;
-}
-
-int VoEHardwareImpl::GetAudioDeviceLayer(AudioLayers& audioLayer) {
-  // Can always be called regardless of VoE state
-
-  AudioDeviceModule::AudioLayer activeLayer(
-      AudioDeviceModule::kPlatformDefaultAudio);
-
-  if (_shared->audio_device()) {
-    // Get active audio layer from ADM
-    if (_shared->audio_device()->ActiveAudioLayer(&activeLayer) != 0) {
-      _shared->SetLastError(VE_UNDEFINED_SC_ERR, kTraceError,
-                            "  Audio Device error");
-      return -1;
-    }
-  } else {
-    // Return VoE's internal layer setting
-    activeLayer = _shared->audio_device_layer();
-  }
-
-  // Map to AudioLayers
-  switch (activeLayer) {
-    case AudioDeviceModule::kPlatformDefaultAudio:
-      audioLayer = kAudioPlatformDefault;
-      break;
-    case AudioDeviceModule::kWindowsCoreAudio:
-      audioLayer = kAudioWindowsCore;
-      break;
-    case AudioDeviceModule::kLinuxAlsaAudio:
-      audioLayer = kAudioLinuxAlsa;
-      break;
-    case AudioDeviceModule::kLinuxPulseAudio:
-      audioLayer = kAudioLinuxPulse;
-      break;
-    default:
-      _shared->SetLastError(VE_UNDEFINED_SC_ERR, kTraceError,
-                            "  unknown audio layer");
-  }
-
-  return 0;
-}
-int VoEHardwareImpl::GetNumOfRecordingDevices(int& devices) {
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-
-  devices = static_cast<int>(_shared->audio_device()->RecordingDevices());
-
-  return 0;
-}
-
-int VoEHardwareImpl::GetNumOfPlayoutDevices(int& devices) {
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-
-  devices = static_cast<int>(_shared->audio_device()->PlayoutDevices());
-
-  return 0;
-}
-
-int VoEHardwareImpl::GetRecordingDeviceName(int index,
-                                            char strNameUTF8[128],
-                                            char strGuidUTF8[128]) {
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  if (strNameUTF8 == NULL) {
-    _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError,
-                          "GetRecordingDeviceName() invalid argument");
-    return -1;
-  }
-
-  // Note that strGuidUTF8 is allowed to be NULL
-
-  // Init len variable to length of supplied vectors
-  const uint16_t strLen = 128;
-
-  // Check if length has been changed in module
-  static_assert(strLen == kAdmMaxDeviceNameSize, "");
-  static_assert(strLen == kAdmMaxGuidSize, "");
-
-  char name[strLen];
-  char guid[strLen];
-
-  // Get names from module
-  if (_shared->audio_device()->RecordingDeviceName(index, name, guid) != 0) {
-    _shared->SetLastError(VE_CANNOT_RETRIEVE_DEVICE_NAME, kTraceError,
-                          "GetRecordingDeviceName() failed to get device name");
-    return -1;
-  }
-
-  // Copy to vectors supplied by user
-  strncpy(strNameUTF8, name, strLen);
-
-  if (strGuidUTF8 != NULL) {
-    strncpy(strGuidUTF8, guid, strLen);
-  }
-
-  return 0;
-}
-
-int VoEHardwareImpl::GetPlayoutDeviceName(int index,
-                                          char strNameUTF8[128],
-                                          char strGuidUTF8[128]) {
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  if (strNameUTF8 == NULL) {
-    _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError,
-                          "GetPlayoutDeviceName() invalid argument");
-    return -1;
-  }
-
-  // Note that strGuidUTF8 is allowed to be NULL
-
-  // Init len variable to length of supplied vectors
-  const uint16_t strLen = 128;
-
-  // Check if length has been changed in module
-  static_assert(strLen == kAdmMaxDeviceNameSize, "");
-  static_assert(strLen == kAdmMaxGuidSize, "");
-
-  char name[strLen];
-  char guid[strLen];
-
-  // Get names from module
-  if (_shared->audio_device()->PlayoutDeviceName(index, name, guid) != 0) {
-    _shared->SetLastError(VE_CANNOT_RETRIEVE_DEVICE_NAME, kTraceError,
-                          "GetPlayoutDeviceName() failed to get device name");
-    return -1;
-  }
-
-  // Copy to vectors supplied by user
-  strncpy(strNameUTF8, name, strLen);
-
-  if (strGuidUTF8 != NULL) {
-    strncpy(strGuidUTF8, guid, strLen);
-  }
-
-  return 0;
-}
-
-int VoEHardwareImpl::SetRecordingDevice(int index,
-                                        StereoChannel recordingChannel) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "SetRecordingDevice(index=%d, recordingChannel=%d)", index,
-               (int)recordingChannel);
-  rtc::CritScope cs(_shared->crit_sec());
-
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-
-  bool isRecording(false);
-
-  // Store state about activated recording to be able to restore it after the
-  // recording device has been modified.
-  if (_shared->audio_device()->Recording()) {
-    WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_shared->instance_id(), -1),
-                 "SetRecordingDevice() device is modified while recording"
-                 " is active...");
-    isRecording = true;
-    if (_shared->audio_device()->StopRecording() == -1) {
-      _shared->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceError,
-                            "SetRecordingDevice() unable to stop recording");
-      return -1;
-    }
-  }
-
-  // We let the module do the index sanity
-
-  // Set recording channel
-  AudioDeviceModule::ChannelType recCh = AudioDeviceModule::kChannelBoth;
-  switch (recordingChannel) {
-    case kStereoLeft:
-      recCh = AudioDeviceModule::kChannelLeft;
-      break;
-    case kStereoRight:
-      recCh = AudioDeviceModule::kChannelRight;
-      break;
-    case kStereoBoth:
-      // default setting kChannelBoth (<=> mono)
-      break;
-  }
-
-  if (_shared->audio_device()->SetRecordingChannel(recCh) != 0) {
-    _shared->SetLastError(
-        VE_AUDIO_DEVICE_MODULE_ERROR, kTraceWarning,
-        "SetRecordingChannel() unable to set the recording channel");
-  }
-
-  // Map indices to unsigned since underlying functions need that
-  uint16_t indexU = static_cast<uint16_t>(index);
-
-  int32_t res(0);
-
-  if (index == -1) {
-    res = _shared->audio_device()->SetRecordingDevice(
-        AudioDeviceModule::kDefaultCommunicationDevice);
-  } else if (index == -2) {
-    res = _shared->audio_device()->SetRecordingDevice(
-        AudioDeviceModule::kDefaultDevice);
-  } else {
-    res = _shared->audio_device()->SetRecordingDevice(indexU);
-  }
-
-  if (res != 0) {
-    _shared->SetLastError(
-        VE_AUDIO_DEVICE_MODULE_ERROR, kTraceError,
-        "SetRecordingDevice() unable to set the recording device");
-    return -1;
-  }
-
-  // Init microphone, so user can do volume settings etc
-  if (_shared->audio_device()->InitMicrophone() == -1) {
-    _shared->SetLastError(VE_CANNOT_ACCESS_MIC_VOL, kTraceWarning,
-                          "SetRecordingDevice() cannot access microphone");
-  }
-
-  // Set number of channels
-  bool available = false;
-  if (_shared->audio_device()->StereoRecordingIsAvailable(&available) != 0) {
-    _shared->SetLastError(
-        VE_SOUNDCARD_ERROR, kTraceWarning,
-        "StereoRecordingIsAvailable() failed to query stereo recording");
-  }
-
-  if (_shared->audio_device()->SetStereoRecording(available) != 0) {
-    _shared->SetLastError(
-        VE_SOUNDCARD_ERROR, kTraceWarning,
-        "SetRecordingDevice() failed to set mono recording mode");
-  }
-
-  // Restore recording if it was enabled already when calling this function.
-  if (isRecording) {
-    WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_shared->instance_id(), -1),
-                 "SetRecordingDevice() recording is now being restored...");
-    if (_shared->audio_device()->InitRecording() != 0) {
-      WEBRTC_TRACE(kTraceError, kTraceVoice,
-                   VoEId(_shared->instance_id(), -1),
-                   "SetRecordingDevice() failed to initialize recording");
-      return -1;
-    }
-    if (_shared->audio_device()->StartRecording() != 0) {
-      WEBRTC_TRACE(kTraceError, kTraceVoice,
-                   VoEId(_shared->instance_id(), -1),
-                   "SetRecordingDevice() failed to start recording");
-      return -1;
-    }
-  }
-
-  return 0;
-}
-
-int VoEHardwareImpl::SetPlayoutDevice(int index) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "SetPlayoutDevice(index=%d)", index);
-  rtc::CritScope cs(_shared->crit_sec());
-
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-
-  bool isPlaying(false);
-
-  // Store state about activated playout to be able to restore it after the
-  // playout device has been modified.
-  if (_shared->audio_device()->Playing()) {
-    WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_shared->instance_id(), -1),
-                 "SetPlayoutDevice() device is modified while playout is "
-                 "active...");
-    isPlaying = true;
-    if (_shared->audio_device()->StopPlayout() == -1) {
-      _shared->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceError,
-                            "SetPlayoutDevice() unable to stop playout");
-      return -1;
-    }
-  }
-
-  // We let the module do the index sanity
-
-  // Map indices to unsigned since underlying functions need that
-  uint16_t indexU = static_cast<uint16_t>(index);
-
-  int32_t res(0);
-
-  if (index == -1) {
-    res = _shared->audio_device()->SetPlayoutDevice(
-        AudioDeviceModule::kDefaultCommunicationDevice);
-  } else if (index == -2) {
-    res = _shared->audio_device()->SetPlayoutDevice(
-        AudioDeviceModule::kDefaultDevice);
-  } else {
-    res = _shared->audio_device()->SetPlayoutDevice(indexU);
-  }
-
-  if (res != 0) {
-    _shared->SetLastError(
-        VE_SOUNDCARD_ERROR, kTraceError,
-        "SetPlayoutDevice() unable to set the playout device");
-    return -1;
-  }
-
-  // Init speaker, so user can do volume settings etc
-  if (_shared->audio_device()->InitSpeaker() == -1) {
-    _shared->SetLastError(VE_CANNOT_ACCESS_SPEAKER_VOL, kTraceWarning,
-                          "SetPlayoutDevice() cannot access speaker");
-  }
-
-  // Set number of channels
-  bool available = false;
-  _shared->audio_device()->StereoPlayoutIsAvailable(&available);
-  if (_shared->audio_device()->SetStereoPlayout(available) != 0) {
-    _shared->SetLastError(
-        VE_SOUNDCARD_ERROR, kTraceWarning,
-        "SetPlayoutDevice() failed to set stereo playout mode");
-  }
-
-  // Restore playout if it was enabled already when calling this function.
-  if (isPlaying) {
-    WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_shared->instance_id(), -1),
-                 "SetPlayoutDevice() playout is now being restored...");
-    if (_shared->audio_device()->InitPlayout() != 0) {
-      WEBRTC_TRACE(kTraceError, kTraceVoice,
-                   VoEId(_shared->instance_id(), -1),
-                   "SetPlayoutDevice() failed to initialize playout");
-      return -1;
-    }
-    if (_shared->audio_device()->StartPlayout() != 0) {
-      WEBRTC_TRACE(kTraceError, kTraceVoice,
-                   VoEId(_shared->instance_id(), -1),
-                   "SetPlayoutDevice() failed to start playout");
-      return -1;
-    }
-  }
-
-  return 0;
-}
-
-int VoEHardwareImpl::SetRecordingSampleRate(unsigned int samples_per_sec) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "%s", __FUNCTION__);
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return false;
-  }
-  return _shared->audio_device()->SetRecordingSampleRate(samples_per_sec);
-}
-
-int VoEHardwareImpl::RecordingSampleRate(unsigned int* samples_per_sec) const {
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return false;
-  }
-  return _shared->audio_device()->RecordingSampleRate(samples_per_sec);
-}
-
-int VoEHardwareImpl::SetPlayoutSampleRate(unsigned int samples_per_sec) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "%s", __FUNCTION__);
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return false;
-  }
-  return _shared->audio_device()->SetPlayoutSampleRate(samples_per_sec);
-}
-
-int VoEHardwareImpl::PlayoutSampleRate(unsigned int* samples_per_sec) const {
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return false;
-  }
-  return _shared->audio_device()->PlayoutSampleRate(samples_per_sec);
-}
-
-bool VoEHardwareImpl::BuiltInAECIsAvailable() const {
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return false;
-  }
-  return _shared->audio_device()->BuiltInAECIsAvailable();
-}
-
-int VoEHardwareImpl::EnableBuiltInAEC(bool enable) {
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  return _shared->audio_device()->EnableBuiltInAEC(enable);
-}
-
-bool VoEHardwareImpl::BuiltInAGCIsAvailable() const {
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return false;
-  }
-  return _shared->audio_device()->BuiltInAGCIsAvailable();
-}
-
-int VoEHardwareImpl::EnableBuiltInAGC(bool enable) {
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  return _shared->audio_device()->EnableBuiltInAGC(enable);
-}
-
-bool VoEHardwareImpl::BuiltInNSIsAvailable() const {
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return false;
-  }
-  return _shared->audio_device()->BuiltInNSIsAvailable();
-}
-
-int VoEHardwareImpl::EnableBuiltInNS(bool enable) {
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  return _shared->audio_device()->EnableBuiltInNS(enable);
-}
-
-}  // namespace webrtc
diff --git a/voice_engine/voe_hardware_impl.h b/voice_engine/voe_hardware_impl.h
deleted file mode 100644
index 1ec1c90..0000000
--- a/voice_engine/voe_hardware_impl.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *  Copyright (c) 2012 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 WEBRTC_VOICE_ENGINE_VOE_HARDWARE_IMPL_H
-#define WEBRTC_VOICE_ENGINE_VOE_HARDWARE_IMPL_H
-
-#include "webrtc/voice_engine/include/voe_hardware.h"
-
-#include "webrtc/voice_engine/shared_data.h"
-
-namespace webrtc {
-
-class VoEHardwareImpl : public VoEHardware {
- public:
-  int GetNumOfRecordingDevices(int& devices) override;
-
-  int GetNumOfPlayoutDevices(int& devices) override;
-
-  int GetRecordingDeviceName(int index,
-                             char strNameUTF8[128],
-                             char strGuidUTF8[128]) override;
-
-  int GetPlayoutDeviceName(int index,
-                           char strNameUTF8[128],
-                           char strGuidUTF8[128]) override;
-
-  int SetRecordingDevice(int index,
-                         StereoChannel recordingChannel = kStereoBoth) override;
-
-  int SetPlayoutDevice(int index) override;
-
-  int SetAudioDeviceLayer(AudioLayers audioLayer) override;
-
-  int GetAudioDeviceLayer(AudioLayers& audioLayer) override;
-
-  int SetRecordingSampleRate(unsigned int samples_per_sec) override;
-  int RecordingSampleRate(unsigned int* samples_per_sec) const override;
-  int SetPlayoutSampleRate(unsigned int samples_per_sec) override;
-  int PlayoutSampleRate(unsigned int* samples_per_sec) const override;
-
-  bool BuiltInAECIsAvailable() const override;
-  int EnableBuiltInAEC(bool enable) override;
-  bool BuiltInAGCIsAvailable() const override;
-  int EnableBuiltInAGC(bool enable) override;
-  bool BuiltInNSIsAvailable() const override;
-  int EnableBuiltInNS(bool enable) override;
-
- protected:
-  VoEHardwareImpl(voe::SharedData* shared);
-  ~VoEHardwareImpl() override;
-
- private:
-  voe::SharedData* _shared;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_VOICE_ENGINE_VOE_HARDWARE_IMPL_H
diff --git a/voice_engine/voice_engine_impl.h b/voice_engine/voice_engine_impl.h
index ec446c6..a224271 100644
--- a/voice_engine/voice_engine_impl.h
+++ b/voice_engine/voice_engine_impl.h
@@ -18,7 +18,6 @@
 #include "webrtc/voice_engine/voe_base_impl.h"
 #include "webrtc/voice_engine/voe_codec_impl.h"
 #include "webrtc/voice_engine/voe_file_impl.h"
-#include "webrtc/voice_engine/voe_hardware_impl.h"
 #include "webrtc/voice_engine/voe_network_impl.h"
 #include "webrtc/voice_engine/voe_rtp_rtcp_impl.h"
 
@@ -31,7 +30,6 @@
                         public VoiceEngine,
                         public VoECodecImpl,
                         public VoEFileImpl,
-                        public VoEHardwareImpl,
                         public VoENetworkImpl,
                         public VoERTP_RTCPImpl,
                         public VoEBaseImpl {
@@ -40,7 +38,6 @@
       : SharedData(),
         VoECodecImpl(this),
         VoEFileImpl(this),
-        VoEHardwareImpl(this),
         VoENetworkImpl(this),
         VoERTP_RTCPImpl(this),
         VoEBaseImpl(this),
