diff --git a/api/BUILD.gn b/api/BUILD.gn
index 52da137..a3e659c 100644
--- a/api/BUILD.gn
+++ b/api/BUILD.gn
@@ -134,6 +134,7 @@
     "audio_codecs:audio_codecs_api",
     "transport:bitrate_settings",
     "transport:network_control",
+    "transport/media:audio_interfaces",
     "units:data_rate",
     "video:encoded_image",
     "video:video_frame",
diff --git a/api/media_transport_interface.cc b/api/media_transport_interface.cc
index 63d7ea1..4b68b4c 100644
--- a/api/media_transport_interface.cc
+++ b/api/media_transport_interface.cc
@@ -29,35 +29,6 @@
     const MediaTransportSettings&) = default;
 MediaTransportSettings::~MediaTransportSettings() = default;
 
-MediaTransportEncodedAudioFrame::~MediaTransportEncodedAudioFrame() {}
-
-MediaTransportEncodedAudioFrame::MediaTransportEncodedAudioFrame(
-    int sampling_rate_hz,
-    int starting_sample_index,
-    int samples_per_channel,
-    int sequence_number,
-    FrameType frame_type,
-    int payload_type,
-    std::vector<uint8_t> encoded_data)
-    : sampling_rate_hz_(sampling_rate_hz),
-      starting_sample_index_(starting_sample_index),
-      samples_per_channel_(samples_per_channel),
-      sequence_number_(sequence_number),
-      frame_type_(frame_type),
-      payload_type_(payload_type),
-      encoded_data_(std::move(encoded_data)) {}
-
-MediaTransportEncodedAudioFrame& MediaTransportEncodedAudioFrame::operator=(
-    const MediaTransportEncodedAudioFrame&) = default;
-
-MediaTransportEncodedAudioFrame& MediaTransportEncodedAudioFrame::operator=(
-    MediaTransportEncodedAudioFrame&&) = default;
-
-MediaTransportEncodedAudioFrame::MediaTransportEncodedAudioFrame(
-    const MediaTransportEncodedAudioFrame&) = default;
-
-MediaTransportEncodedAudioFrame::MediaTransportEncodedAudioFrame(
-    MediaTransportEncodedAudioFrame&&) = default;
 
 MediaTransportEncodedVideoFrame::MediaTransportEncodedVideoFrame() = default;
 
diff --git a/api/media_transport_interface.h b/api/media_transport_interface.h
index 5cd2923..c289d99 100644
--- a/api/media_transport_interface.h
+++ b/api/media_transport_interface.h
@@ -26,6 +26,7 @@
 #include "absl/types/optional.h"
 #include "api/array_view.h"
 #include "api/rtc_error.h"
+#include "api/transport/media/audio_transport.h"
 #include "api/units/data_rate.h"
 #include "api/video/encoded_image.h"
 #include "rtc_base/copy_on_write_buffer.h"
@@ -77,89 +78,6 @@
   RtcEventLog* event_log = nullptr;
 };
 
-// Represents encoded audio frame in any encoding (type of encoding is opaque).
-// To avoid copying of encoded data use move semantics when passing by value.
-class MediaTransportEncodedAudioFrame final {
- public:
-  enum class FrameType {
-    // Normal audio frame (equivalent to webrtc::kAudioFrameSpeech).
-    kSpeech,
-
-    // DTX frame (equivalent to webrtc::kAudioFrameCN).
-    // DTX frame (equivalent to webrtc::kAudioFrameCN).
-    kDiscontinuousTransmission,
-    // TODO(nisse): Mis-spelled version, update users, then delete.
-    kDiscountinuousTransmission = kDiscontinuousTransmission,
-  };
-
-  MediaTransportEncodedAudioFrame(
-      // Audio sampling rate, for example 48000.
-      int sampling_rate_hz,
-
-      // Starting sample index of the frame, i.e. how many audio samples were
-      // before this frame since the beginning of the call or beginning of time
-      // in one channel (the starting point should not matter for NetEq). In
-      // WebRTC it is used as a timestamp of the frame.
-      // TODO(sukhanov): Starting_sample_index is currently adjusted on the
-      // receiver side in RTP path. Non-RTP implementations should preserve it.
-      // For NetEq initial offset should not matter so we should consider fixing
-      // RTP path.
-      int starting_sample_index,
-
-      // Number of audio samples in audio frame in 1 channel.
-      int samples_per_channel,
-
-      // Sequence number of the frame in the order sent, it is currently
-      // required by NetEq, but we can fix NetEq, because starting_sample_index
-      // should be enough.
-      int sequence_number,
-
-      // If audio frame is a speech or discontinued transmission.
-      FrameType frame_type,
-
-      // Opaque payload type. In RTP codepath payload type is stored in RTP
-      // header. In other implementations it should be simply passed through the
-      // wire -- it's needed for decoder.
-      int payload_type,
-
-      // Vector with opaque encoded data.
-      std::vector<uint8_t> encoded_data);
-
-  ~MediaTransportEncodedAudioFrame();
-  MediaTransportEncodedAudioFrame(const MediaTransportEncodedAudioFrame&);
-  MediaTransportEncodedAudioFrame& operator=(
-      const MediaTransportEncodedAudioFrame& other);
-  MediaTransportEncodedAudioFrame& operator=(
-      MediaTransportEncodedAudioFrame&& other);
-  MediaTransportEncodedAudioFrame(MediaTransportEncodedAudioFrame&&);
-
-  // Getters.
-  int sampling_rate_hz() const { return sampling_rate_hz_; }
-  int starting_sample_index() const { return starting_sample_index_; }
-  int samples_per_channel() const { return samples_per_channel_; }
-  int sequence_number() const { return sequence_number_; }
-
-  int payload_type() const { return payload_type_; }
-  FrameType frame_type() const { return frame_type_; }
-
-  rtc::ArrayView<const uint8_t> encoded_data() const { return encoded_data_; }
-
- private:
-  int sampling_rate_hz_;
-  int starting_sample_index_;
-  int samples_per_channel_;
-
-  // TODO(sukhanov): Refactor NetEq so we don't need sequence number.
-  // Having sample_index and samples_per_channel should be enough.
-  int sequence_number_;
-
-  FrameType frame_type_;
-
-  int payload_type_;
-
-  std::vector<uint8_t> encoded_data_;
-};
-
 // Callback to notify about network route changes.
 class MediaTransportNetworkChangeCallback {
  public:
@@ -170,17 +88,6 @@
       const rtc::NetworkRoute& new_network_route) = 0;
 };
 
-// Interface for receiving encoded audio frames from MediaTransportInterface
-// implementations.
-class MediaTransportAudioSinkInterface {
- public:
-  virtual ~MediaTransportAudioSinkInterface() = default;
-
-  // Called when new encoded audio frame is received.
-  virtual void OnData(uint64_t channel_id,
-                      MediaTransportEncodedAudioFrame frame) = 0;
-};
-
 // Represents encoded video frame, along with the codec information.
 class MediaTransportEncodedVideoFrame final {
  public:
diff --git a/api/transport/media/BUILD.gn b/api/transport/media/BUILD.gn
new file mode 100644
index 0000000..aca8803
--- /dev/null
+++ b/api/transport/media/BUILD.gn
@@ -0,0 +1,20 @@
+# Copyright (c) 2019 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.
+
+import("../../../webrtc.gni")
+
+rtc_source_set("audio_interfaces") {
+  visibility = [ "*" ]
+  sources = [
+    "audio_transport.cc",
+    "audio_transport.h",
+  ]
+  deps = [
+    "../..:array_view",
+  ]
+}
diff --git a/api/transport/media/OWNERS b/api/transport/media/OWNERS
new file mode 100644
index 0000000..b353f12
--- /dev/null
+++ b/api/transport/media/OWNERS
@@ -0,0 +1,3 @@
+sukhanov@webrtc.org
+psla@webrtc.org
+mellem@webrtc.org
diff --git a/api/transport/media/audio_transport.cc b/api/transport/media/audio_transport.cc
new file mode 100644
index 0000000..7285ad4
--- /dev/null
+++ b/api/transport/media/audio_transport.cc
@@ -0,0 +1,54 @@
+/*
+ *  Copyright 2019 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 is EXPERIMENTAL interface for media transport.
+//
+// The goal is to refactor WebRTC code so that audio and video frames
+// are sent / received through the media transport interface. This will
+// enable different media transport implementations, including QUIC-based
+// media transport.
+
+#include <utility>
+
+#include "api/transport/media/audio_transport.h"
+
+namespace webrtc {
+
+MediaTransportEncodedAudioFrame::~MediaTransportEncodedAudioFrame() {}
+
+MediaTransportEncodedAudioFrame::MediaTransportEncodedAudioFrame(
+    int sampling_rate_hz,
+    int starting_sample_index,
+    int samples_per_channel,
+    int sequence_number,
+    FrameType frame_type,
+    int payload_type,
+    std::vector<uint8_t> encoded_data)
+    : sampling_rate_hz_(sampling_rate_hz),
+      starting_sample_index_(starting_sample_index),
+      samples_per_channel_(samples_per_channel),
+      sequence_number_(sequence_number),
+      frame_type_(frame_type),
+      payload_type_(payload_type),
+      encoded_data_(std::move(encoded_data)) {}
+
+MediaTransportEncodedAudioFrame& MediaTransportEncodedAudioFrame::operator=(
+    const MediaTransportEncodedAudioFrame&) = default;
+
+MediaTransportEncodedAudioFrame& MediaTransportEncodedAudioFrame::operator=(
+    MediaTransportEncodedAudioFrame&&) = default;
+
+MediaTransportEncodedAudioFrame::MediaTransportEncodedAudioFrame(
+    const MediaTransportEncodedAudioFrame&) = default;
+
+MediaTransportEncodedAudioFrame::MediaTransportEncodedAudioFrame(
+    MediaTransportEncodedAudioFrame&&) = default;
+
+}  // namespace webrtc
diff --git a/api/transport/media/audio_transport.h b/api/transport/media/audio_transport.h
new file mode 100644
index 0000000..dcbdcd7
--- /dev/null
+++ b/api/transport/media/audio_transport.h
@@ -0,0 +1,120 @@
+/* Copyright 2019 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 is EXPERIMENTAL interface for media transport.
+//
+// The goal is to refactor WebRTC code so that audio and video frames
+// are sent / received through the media transport interface. This will
+// enable different media transport implementations, including QUIC-based
+// media transport.
+
+#ifndef API_TRANSPORT_MEDIA_AUDIO_TRANSPORT_H_
+#define API_TRANSPORT_MEDIA_AUDIO_TRANSPORT_H_
+
+#include <vector>
+
+#include "api/array_view.h"
+
+namespace webrtc {
+
+// Represents encoded audio frame in any encoding (type of encoding is opaque).
+// To avoid copying of encoded data use move semantics when passing by value.
+class MediaTransportEncodedAudioFrame final {
+ public:
+  enum class FrameType {
+    // Normal audio frame (equivalent to webrtc::kAudioFrameSpeech).
+    kSpeech,
+
+    // DTX frame (equivalent to webrtc::kAudioFrameCN).
+    kDiscontinuousTransmission,
+    // TODO(nisse): Mis-spelled version, update users, then delete.
+    kDiscountinuousTransmission = kDiscontinuousTransmission,
+  };
+
+  MediaTransportEncodedAudioFrame(
+      // Audio sampling rate, for example 48000.
+      int sampling_rate_hz,
+
+      // Starting sample index of the frame, i.e. how many audio samples were
+      // before this frame since the beginning of the call or beginning of time
+      // in one channel (the starting point should not matter for NetEq). In
+      // WebRTC it is used as a timestamp of the frame.
+      // TODO(sukhanov): Starting_sample_index is currently adjusted on the
+      // receiver side in RTP path. Non-RTP implementations should preserve it.
+      // For NetEq initial offset should not matter so we should consider fixing
+      // RTP path.
+      int starting_sample_index,
+
+      // Number of audio samples in audio frame in 1 channel.
+      int samples_per_channel,
+
+      // Sequence number of the frame in the order sent, it is currently
+      // required by NetEq, but we can fix NetEq, because starting_sample_index
+      // should be enough.
+      int sequence_number,
+
+      // If audio frame is a speech or discontinued transmission.
+      FrameType frame_type,
+
+      // Opaque payload type. In RTP codepath payload type is stored in RTP
+      // header. In other implementations it should be simply passed through the
+      // wire -- it's needed for decoder.
+      int payload_type,
+
+      // Vector with opaque encoded data.
+      std::vector<uint8_t> encoded_data);
+
+  ~MediaTransportEncodedAudioFrame();
+  MediaTransportEncodedAudioFrame(const MediaTransportEncodedAudioFrame&);
+  MediaTransportEncodedAudioFrame& operator=(
+      const MediaTransportEncodedAudioFrame& other);
+  MediaTransportEncodedAudioFrame& operator=(
+      MediaTransportEncodedAudioFrame&& other);
+  MediaTransportEncodedAudioFrame(MediaTransportEncodedAudioFrame&&);
+
+  // Getters.
+  int sampling_rate_hz() const { return sampling_rate_hz_; }
+  int starting_sample_index() const { return starting_sample_index_; }
+  int samples_per_channel() const { return samples_per_channel_; }
+  int sequence_number() const { return sequence_number_; }
+
+  int payload_type() const { return payload_type_; }
+  FrameType frame_type() const { return frame_type_; }
+
+  rtc::ArrayView<const uint8_t> encoded_data() const { return encoded_data_; }
+
+ private:
+  int sampling_rate_hz_;
+  int starting_sample_index_;
+  int samples_per_channel_;
+
+  // TODO(sukhanov): Refactor NetEq so we don't need sequence number.
+  // Having sample_index and samples_per_channel should be enough.
+  int sequence_number_;
+
+  FrameType frame_type_;
+
+  int payload_type_;
+
+  std::vector<uint8_t> encoded_data_;
+};
+
+// Interface for receiving encoded audio frames from MediaTransportInterface
+// implementations.
+class MediaTransportAudioSinkInterface {
+ public:
+  virtual ~MediaTransportAudioSinkInterface() = default;
+
+  // Called when new encoded audio frame is received.
+  virtual void OnData(uint64_t channel_id,
+                      MediaTransportEncodedAudioFrame frame) = 0;
+};
+
+}  // namespace webrtc
+#endif  // API_TRANSPORT_MEDIA_AUDIO_TRANSPORT_H_
