diff --git a/webrtc/api/webrtcsdp.cc b/webrtc/api/webrtcsdp.cc
index fa05241..b2e75a2 100644
--- a/webrtc/api/webrtcsdp.cc
+++ b/webrtc/api/webrtcsdp.cc
@@ -27,6 +27,8 @@
 #include "webrtc/base/logging.h"
 #include "webrtc/base/messagedigest.h"
 #include "webrtc/base/stringutils.h"
+// for RtpExtension
+#include "webrtc/config.h"
 #include "webrtc/media/base/codec.h"
 #include "webrtc/media/base/cryptoparams.h"
 #include "webrtc/media/base/mediaconstants.h"
@@ -64,7 +66,7 @@
 using cricket::kCodecParamAssociatedPayloadType;
 using cricket::MediaContentDescription;
 using cricket::MediaType;
-using cricket::RtpHeaderExtension;
+using cricket::RtpHeaderExtensions;
 using cricket::SsrcGroup;
 using cricket::StreamParams;
 using cricket::StreamParamsVec;
@@ -73,8 +75,6 @@
 using cricket::VideoContentDescription;
 using rtc::SocketAddress;
 
-typedef std::vector<RtpHeaderExtension> RtpHeaderExtensions;
-
 namespace cricket {
 class SessionDescription;
 }
@@ -309,7 +309,7 @@
                             std::vector<std::string>* transport_options,
                             SdpParseError* error);
 static bool ParseExtmap(const std::string& line,
-                        RtpHeaderExtension* extmap,
+                        RtpExtension* extmap,
                         SdpParseError* error);
 static bool ParseFingerprintAttribute(const std::string& line,
                                       rtc::SSLFingerprint** fingerprint,
@@ -1168,7 +1168,8 @@
   return true;
 }
 
-bool ParseExtmap(const std::string& line, RtpHeaderExtension* extmap,
+bool ParseExtmap(const std::string& line,
+                 RtpExtension* extmap,
                  SdpParseError* error) {
   // RFC 5285
   // a=extmap:<value>["/"<direction>] <URI> <extensionattributes>
@@ -1192,7 +1193,7 @@
     return false;
   }
 
-  *extmap = RtpHeaderExtension(uri, value);
+  *extmap = RtpExtension(uri, value);
   return true;
 }
 
@@ -2015,7 +2016,7 @@
       desc->set_msid_supported(
           CaseInsensitiveFind(semantics, kMediaStreamSemantic));
     } else if (HasAttribute(line, kAttributeExtmap)) {
-      RtpHeaderExtension extmap;
+      RtpExtension extmap;
       if (!ParseExtmap(line, &extmap, error)) {
         return false;
       }
@@ -2703,7 +2704,7 @@
       } else if (HasAttribute(line, kAttributeSendRecv)) {
         media_desc->set_direction(cricket::MD_SENDRECV);
       } else if (HasAttribute(line, kAttributeExtmap)) {
-        RtpHeaderExtension extmap;
+        RtpExtension extmap;
         if (!ParseExtmap(line, &extmap, error)) {
           return false;
         }
diff --git a/webrtc/api/webrtcsdp_unittest.cc b/webrtc/api/webrtcsdp_unittest.cc
index 4bc84fd..5c69d50 100644
--- a/webrtc/api/webrtcsdp_unittest.cc
+++ b/webrtc/api/webrtcsdp_unittest.cc
@@ -44,7 +44,6 @@
 using cricket::LOCAL_PORT_TYPE;
 using cricket::NS_JINGLE_DRAFT_SCTP;
 using cricket::NS_JINGLE_RTP;
-using cricket::RtpHeaderExtension;
 using cricket::RELAY_PORT_TYPE;
 using cricket::SessionDescription;
 using cricket::StreamParams;
@@ -57,6 +56,7 @@
 using webrtc::IceCandidateInterface;
 using webrtc::JsepIceCandidate;
 using webrtc::JsepSessionDescription;
+using webrtc::RtpExtension;
 using webrtc::SdpParseError;
 using webrtc::SessionDescriptionInterface;
 
@@ -1110,8 +1110,8 @@
     ASSERT_EQ(cd1->rtp_header_extensions().size(),
               cd2->rtp_header_extensions().size());
     for (size_t i = 0; i< cd1->rtp_header_extensions().size(); ++i) {
-      const RtpHeaderExtension ext1 = cd1->rtp_header_extensions().at(i);
-      const RtpHeaderExtension ext2 = cd2->rtp_header_extensions().at(i);
+      const RtpExtension ext1 = cd1->rtp_header_extensions().at(i);
+      const RtpExtension ext2 = cd2->rtp_header_extensions().at(i);
       EXPECT_EQ(ext1.uri, ext2.uri);
       EXPECT_EQ(ext1.id, ext2.id);
     }
@@ -1333,10 +1333,8 @@
         audio_desc_->Copy());
     video_desc_ = static_cast<VideoContentDescription*>(
         video_desc_->Copy());
-    audio_desc_->AddRtpHeaderExtension(
-        RtpHeaderExtension(kExtmapUri, kExtmapId));
-    video_desc_->AddRtpHeaderExtension(
-        RtpHeaderExtension(kExtmapUri, kExtmapId));
+    audio_desc_->AddRtpHeaderExtension(RtpExtension(kExtmapUri, kExtmapId));
+    video_desc_->AddRtpHeaderExtension(RtpExtension(kExtmapUri, kExtmapId));
     desc_.RemoveContentByName(kAudioContentName);
     desc_.RemoveContentByName(kVideoContentName);
     desc_.AddContent(kAudioContentName, NS_JINGLE_RTP, audio_desc_);
diff --git a/webrtc/audio/audio_receive_stream.cc b/webrtc/audio/audio_receive_stream.cc
index fb17fcc..e391df4 100644
--- a/webrtc/audio/audio_receive_stream.cc
+++ b/webrtc/audio/audio_receive_stream.cc
@@ -38,7 +38,7 @@
     return false;
   }
   for (const auto& extension : config.rtp.extensions) {
-    if (extension.name == RtpExtension::kTransportSequenceNumber) {
+    if (extension.uri == RtpExtension::kTransportSequenceNumberUri) {
       return true;
     }
   }
@@ -97,17 +97,17 @@
   channel_proxy_->RegisterExternalTransport(config.rtcp_send_transport);
 
   for (const auto& extension : config.rtp.extensions) {
-    if (extension.name == RtpExtension::kAudioLevel) {
+    if (extension.uri == RtpExtension::kAudioLevelUri) {
       channel_proxy_->SetReceiveAudioLevelIndicationStatus(true, extension.id);
       bool registered = rtp_header_parser_->RegisterRtpHeaderExtension(
           kRtpExtensionAudioLevel, extension.id);
       RTC_DCHECK(registered);
-    } else if (extension.name == RtpExtension::kAbsSendTime) {
+    } else if (extension.uri == RtpExtension::kAbsSendTimeUri) {
       channel_proxy_->SetReceiveAbsoluteSenderTimeStatus(true, extension.id);
       bool registered = rtp_header_parser_->RegisterRtpHeaderExtension(
           kRtpExtensionAbsoluteSendTime, extension.id);
       RTC_DCHECK(registered);
-    } else if (extension.name == RtpExtension::kTransportSequenceNumber) {
+    } else if (extension.uri == RtpExtension::kTransportSequenceNumberUri) {
       channel_proxy_->EnableReceiveTransportSequenceNumber(extension.id);
       bool registered = rtp_header_parser_->RegisterRtpHeaderExtension(
           kRtpExtensionTransportSequenceNumber, extension.id);
diff --git a/webrtc/audio/audio_receive_stream_unittest.cc b/webrtc/audio/audio_receive_stream_unittest.cc
index a5318d5..fd913db 100644
--- a/webrtc/audio/audio_receive_stream_unittest.cc
+++ b/webrtc/audio/audio_receive_stream_unittest.cc
@@ -108,11 +108,11 @@
     stream_config_.rtp.local_ssrc = kLocalSsrc;
     stream_config_.rtp.remote_ssrc = kRemoteSsrc;
     stream_config_.rtp.extensions.push_back(
-        RtpExtension(RtpExtension::kAbsSendTime, kAbsSendTimeId));
+        RtpExtension(RtpExtension::kAbsSendTimeUri, kAbsSendTimeId));
     stream_config_.rtp.extensions.push_back(
-        RtpExtension(RtpExtension::kAudioLevel, kAudioLevelId));
+        RtpExtension(RtpExtension::kAudioLevelUri, kAudioLevelId));
     stream_config_.rtp.extensions.push_back(RtpExtension(
-        RtpExtension::kTransportSequenceNumber, kTransportSequenceNumberId));
+        RtpExtension::kTransportSequenceNumberUri, kTransportSequenceNumberId));
   }
 
   MockCongestionController* congestion_controller() {
@@ -224,10 +224,10 @@
   config.rtp.remote_ssrc = kRemoteSsrc;
   config.rtp.local_ssrc = kLocalSsrc;
   config.rtp.extensions.push_back(
-      RtpExtension(RtpExtension::kAbsSendTime, kAbsSendTimeId));
+      RtpExtension(RtpExtension::kAbsSendTimeUri, kAbsSendTimeId));
   config.voe_channel_id = kChannelId;
   EXPECT_EQ(
-      "{rtp: {remote_ssrc: 1234, local_ssrc: 5678, extensions: [{name: "
+      "{rtp: {remote_ssrc: 1234, local_ssrc: 5678, extensions: [{uri: "
       "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time, id: 2}], "
       "transport_cc: off}, "
       "rtcp_send_transport: nullptr, "
diff --git a/webrtc/audio/audio_send_stream.cc b/webrtc/audio/audio_send_stream.cc
index c0a709e..e9659c6 100644
--- a/webrtc/audio/audio_send_stream.cc
+++ b/webrtc/audio/audio_send_stream.cc
@@ -79,11 +79,11 @@
   channel_proxy_->RegisterExternalTransport(config.send_transport);
 
   for (const auto& extension : config.rtp.extensions) {
-    if (extension.name == RtpExtension::kAbsSendTime) {
+    if (extension.uri == RtpExtension::kAbsSendTimeUri) {
       channel_proxy_->SetSendAbsoluteSenderTimeStatus(true, extension.id);
-    } else if (extension.name == RtpExtension::kAudioLevel) {
+    } else if (extension.uri == RtpExtension::kAudioLevelUri) {
       channel_proxy_->SetSendAudioLevelIndicationStatus(true, extension.id);
-    } else if (extension.name == RtpExtension::kTransportSequenceNumber) {
+    } else if (extension.uri == RtpExtension::kTransportSequenceNumberUri) {
       channel_proxy_->EnableSendTransportSequenceNumber(extension.id);
     } else {
       RTC_NOTREACHED() << "Registering unsupported RTP extension.";
diff --git a/webrtc/audio/audio_send_stream_unittest.cc b/webrtc/audio/audio_send_stream_unittest.cc
index a94034c..4d9d465 100644
--- a/webrtc/audio/audio_send_stream_unittest.cc
+++ b/webrtc/audio/audio_send_stream_unittest.cc
@@ -99,11 +99,11 @@
     stream_config_.rtp.ssrc = kSsrc;
     stream_config_.rtp.c_name = kCName;
     stream_config_.rtp.extensions.push_back(
-        RtpExtension(RtpExtension::kAudioLevel, kAudioLevelId));
+        RtpExtension(RtpExtension::kAudioLevelUri, kAudioLevelId));
     stream_config_.rtp.extensions.push_back(
-        RtpExtension(RtpExtension::kAbsSendTime, kAbsSendTimeId));
+        RtpExtension(RtpExtension::kAbsSendTimeUri, kAbsSendTimeId));
     stream_config_.rtp.extensions.push_back(RtpExtension(
-        RtpExtension::kTransportSequenceNumber, kTransportSequenceNumberId));
+        RtpExtension::kTransportSequenceNumberUri, kTransportSequenceNumberId));
   }
 
   AudioSendStream::Config& config() { return stream_config_; }
@@ -171,13 +171,13 @@
   AudioSendStream::Config config(nullptr);
   config.rtp.ssrc = kSsrc;
   config.rtp.extensions.push_back(
-      RtpExtension(RtpExtension::kAbsSendTime, kAbsSendTimeId));
+      RtpExtension(RtpExtension::kAbsSendTimeUri, kAbsSendTimeId));
   config.rtp.c_name = kCName;
   config.voe_channel_id = kChannelId;
   config.cng_payload_type = 42;
   config.red_payload_type = 17;
   EXPECT_EQ(
-      "{rtp: {ssrc: 1234, extensions: [{name: "
+      "{rtp: {ssrc: 1234, extensions: [{uri: "
       "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time, id: 3}], "
       "c_name: foo_name}, voe_channel_id: 1, cng_payload_type: 42, "
       "red_payload_type: 17}",
diff --git a/webrtc/call/bitrate_estimator_tests.cc b/webrtc/call/bitrate_estimator_tests.cc
index 122e5bb..8cd2799 100644
--- a/webrtc/call/bitrate_estimator_tests.cc
+++ b/webrtc/call/bitrate_estimator_tests.cc
@@ -134,9 +134,9 @@
     receive_config_.rtp.local_ssrc = kReceiverLocalVideoSsrc;
     receive_config_.rtp.remb = true;
     receive_config_.rtp.extensions.push_back(
-        RtpExtension(RtpExtension::kTOffset, kTOFExtensionId));
+        RtpExtension(RtpExtension::kTimestampOffsetUri, kTOFExtensionId));
     receive_config_.rtp.extensions.push_back(
-        RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId));
+        RtpExtension(RtpExtension::kAbsSendTimeUri, kASTExtensionId));
   }
 
   virtual void TearDown() {
@@ -189,7 +189,7 @@
         // an underlying channel id.
         receive_config.voe_channel_id = 0;
         receive_config.rtp.extensions.push_back(
-            RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId));
+            RtpExtension(RtpExtension::kAbsSendTimeUri, kASTExtensionId));
         audio_receive_stream_ =
             test_->receiver_call_->CreateAudioReceiveStream(receive_config);
       } else {
@@ -265,7 +265,7 @@
 
 TEST_F(BitrateEstimatorTest, InstantiatesTOFPerDefaultForVideo) {
   video_send_config_.rtp.extensions.push_back(
-      RtpExtension(RtpExtension::kTOffset, kTOFExtensionId));
+      RtpExtension(RtpExtension::kTimestampOffsetUri, kTOFExtensionId));
   receiver_log_.PushExpectedLogLine(kSingleStreamLog);
   receiver_log_.PushExpectedLogLine(kAbsSendTimeLog);
   receiver_log_.PushExpectedLogLine(kSingleStreamLog);
@@ -275,7 +275,7 @@
 
 TEST_F(BitrateEstimatorTest, ImmediatelySwitchToASTForVideo) {
   video_send_config_.rtp.extensions.push_back(
-      RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId));
+      RtpExtension(RtpExtension::kAbsSendTimeUri, kASTExtensionId));
   receiver_log_.PushExpectedLogLine(kSingleStreamLog);
   receiver_log_.PushExpectedLogLine(kAbsSendTimeLog);
   receiver_log_.PushExpectedLogLine(kSingleStreamLog);
@@ -287,7 +287,7 @@
 
 TEST_F(BitrateEstimatorTest, SwitchesToASTForVideo) {
   video_send_config_.rtp.extensions.push_back(
-      RtpExtension(RtpExtension::kTOffset, kTOFExtensionId));
+      RtpExtension(RtpExtension::kTimestampOffsetUri, kTOFExtensionId));
   receiver_log_.PushExpectedLogLine(kSingleStreamLog);
   receiver_log_.PushExpectedLogLine(kAbsSendTimeLog);
   receiver_log_.PushExpectedLogLine(kSingleStreamLog);
@@ -295,7 +295,7 @@
   EXPECT_TRUE(receiver_log_.Wait());
 
   video_send_config_.rtp.extensions[0] =
-      RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId);
+      RtpExtension(RtpExtension::kAbsSendTimeUri, kASTExtensionId);
   receiver_log_.PushExpectedLogLine(kAbsSendTimeLog);
   receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE.");
   streams_.push_back(new Stream(this, false));
@@ -305,7 +305,7 @@
 // This test is flaky. See webrtc:5790.
 TEST_F(BitrateEstimatorTest, DISABLED_SwitchesToASTThenBackToTOFForVideo) {
   video_send_config_.rtp.extensions.push_back(
-      RtpExtension(RtpExtension::kTOffset, kTOFExtensionId));
+      RtpExtension(RtpExtension::kTimestampOffsetUri, kTOFExtensionId));
   receiver_log_.PushExpectedLogLine(kSingleStreamLog);
   receiver_log_.PushExpectedLogLine(kAbsSendTimeLog);
   receiver_log_.PushExpectedLogLine(kSingleStreamLog);
@@ -313,14 +313,14 @@
   EXPECT_TRUE(receiver_log_.Wait());
 
   video_send_config_.rtp.extensions[0] =
-      RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId);
+      RtpExtension(RtpExtension::kAbsSendTimeUri, kASTExtensionId);
   receiver_log_.PushExpectedLogLine(kAbsSendTimeLog);
   receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE.");
   streams_.push_back(new Stream(this, false));
   EXPECT_TRUE(receiver_log_.Wait());
 
   video_send_config_.rtp.extensions[0] =
-      RtpExtension(RtpExtension::kTOffset, kTOFExtensionId);
+      RtpExtension(RtpExtension::kTimestampOffsetUri, kTOFExtensionId);
   receiver_log_.PushExpectedLogLine(kAbsSendTimeLog);
   receiver_log_.PushExpectedLogLine(
       "WrappingBitrateEstimator: Switching to transmission time offset RBE.");
diff --git a/webrtc/call/rampup_tests.cc b/webrtc/call/rampup_tests.cc
index c9ce7e1..d6271d3 100644
--- a/webrtc/call/rampup_tests.cc
+++ b/webrtc/call/rampup_tests.cc
@@ -121,12 +121,12 @@
 
   bool remb;
   bool transport_cc;
-  if (extension_type_ == RtpExtension::kAbsSendTime) {
+  if (extension_type_ == RtpExtension::kAbsSendTimeUri) {
     remb = true;
     transport_cc = false;
     send_config->rtp.extensions.push_back(
         RtpExtension(extension_type_.c_str(), kAbsSendTimeExtensionId));
-  } else if (extension_type_ == RtpExtension::kTransportSequenceNumber) {
+  } else if (extension_type_ == RtpExtension::kTransportSequenceNumberUri) {
     remb = false;
     transport_cc = true;
     send_config->rtp.extensions.push_back(RtpExtension(
@@ -182,18 +182,18 @@
   if (num_audio_streams_ == 0)
     return;
 
-  EXPECT_NE(RtpExtension::kTOffset, extension_type_)
+  EXPECT_NE(RtpExtension::kTimestampOffsetUri, extension_type_)
       << "Audio BWE not supported with toffset.";
 
   send_config->rtp.ssrc = audio_ssrcs_[0];
   send_config->rtp.extensions.clear();
 
   bool transport_cc = false;
-  if (extension_type_ == RtpExtension::kAbsSendTime) {
+  if (extension_type_ == RtpExtension::kAbsSendTimeUri) {
     transport_cc = false;
     send_config->rtp.extensions.push_back(
         RtpExtension(extension_type_.c_str(), kAbsSendTimeExtensionId));
-  } else if (extension_type_ == RtpExtension::kTransportSequenceNumber) {
+  } else if (extension_type_ == RtpExtension::kTransportSequenceNumberUri) {
     transport_cc = true;
     send_config->rtp.extensions.push_back(RtpExtension(
         extension_type_.c_str(), kTransportSequenceNumberExtensionId));
@@ -439,28 +439,28 @@
 };
 
 TEST_F(RampUpTest, SingleStream) {
-  RampUpTester test(1, 0, 0, RtpExtension::kTOffset, false, false);
+  RampUpTester test(1, 0, 0, RtpExtension::kTimestampOffsetUri, false, false);
   RunBaseTest(&test);
 }
 
 TEST_F(RampUpTest, Simulcast) {
-  RampUpTester test(3, 0, 0, RtpExtension::kTOffset, false, false);
+  RampUpTester test(3, 0, 0, RtpExtension::kTimestampOffsetUri, false, false);
   RunBaseTest(&test);
 }
 
 TEST_F(RampUpTest, SimulcastWithRtx) {
-  RampUpTester test(3, 0, 0, RtpExtension::kTOffset, true, false);
+  RampUpTester test(3, 0, 0, RtpExtension::kTimestampOffsetUri, true, false);
   RunBaseTest(&test);
 }
 
 TEST_F(RampUpTest, SimulcastByRedWithRtx) {
-  RampUpTester test(3, 0, 0, RtpExtension::kTOffset, true, true);
+  RampUpTester test(3, 0, 0, RtpExtension::kTimestampOffsetUri, true, true);
   RunBaseTest(&test);
 }
 
 TEST_F(RampUpTest, SingleStreamWithHighStartBitrate) {
-  RampUpTester test(1, 0, 0.9 * kSingleStreamTargetBps, RtpExtension::kTOffset,
-                    false, false);
+  RampUpTester test(1, 0, 0.9 * kSingleStreamTargetBps,
+                    RtpExtension::kTimestampOffsetUri, false, false);
   RunBaseTest(&test);
 }
 
@@ -472,46 +472,47 @@
 
 // Disabled: https://bugs.chromium.org/p/webrtc/issues/detail?id=5576
 TEST_F(RampUpTest, DISABLED_UpDownUpOneStream) {
-  RampUpDownUpTester test(1, 0, kStartBitrateBps, RtpExtension::kAbsSendTime,
+  RampUpDownUpTester test(1, 0, kStartBitrateBps, RtpExtension::kAbsSendTimeUri,
                           false, false);
   RunBaseTest(&test);
 }
 
 TEST_F(RampUpTest, UpDownUpThreeStreams) {
-  RampUpDownUpTester test(3, 0, kStartBitrateBps, RtpExtension::kAbsSendTime,
+  RampUpDownUpTester test(3, 0, kStartBitrateBps, RtpExtension::kAbsSendTimeUri,
                           false, false);
   RunBaseTest(&test);
 }
 
 // Disabled: https://bugs.chromium.org/p/webrtc/issues/detail?id=5576
 TEST_F(RampUpTest, DISABLED_UpDownUpOneStreamRtx) {
-  RampUpDownUpTester test(1, 0, kStartBitrateBps, RtpExtension::kAbsSendTime,
+  RampUpDownUpTester test(1, 0, kStartBitrateBps, RtpExtension::kAbsSendTimeUri,
                           true, false);
   RunBaseTest(&test);
 }
 
 TEST_F(RampUpTest, UpDownUpThreeStreamsRtx) {
-  RampUpDownUpTester test(3, 0, kStartBitrateBps, RtpExtension::kAbsSendTime,
+  RampUpDownUpTester test(3, 0, kStartBitrateBps, RtpExtension::kAbsSendTimeUri,
                           true, false);
   RunBaseTest(&test);
 }
 
 // Disabled: https://bugs.chromium.org/p/webrtc/issues/detail?id=5576
 TEST_F(RampUpTest, DISABLED_UpDownUpOneStreamByRedRtx) {
-  RampUpDownUpTester test(1, 0, kStartBitrateBps, RtpExtension::kAbsSendTime,
+  RampUpDownUpTester test(1, 0, kStartBitrateBps, RtpExtension::kAbsSendTimeUri,
                           true, true);
   RunBaseTest(&test);
 }
 
 TEST_F(RampUpTest, UpDownUpThreeStreamsByRedRtx) {
-  RampUpDownUpTester test(3, 0, kStartBitrateBps, RtpExtension::kAbsSendTime,
+  RampUpDownUpTester test(3, 0, kStartBitrateBps, RtpExtension::kAbsSendTimeUri,
                           true, true);
   RunBaseTest(&test);
 }
 
 TEST_F(RampUpTest, SendSideVideoUpDownUpRtx) {
   RampUpDownUpTester test(3, 0, kStartBitrateBps,
-                          RtpExtension::kTransportSequenceNumber, true, false);
+                          RtpExtension::kTransportSequenceNumberUri, true,
+                          false);
   RunBaseTest(&test);
 }
 
@@ -519,71 +520,72 @@
 //               allocation.
 TEST_F(RampUpTest, DISABLED_SendSideAudioVideoUpDownUpRtx) {
   RampUpDownUpTester test(3, 1, kStartBitrateBps,
-                          RtpExtension::kTransportSequenceNumber, true, false);
+                          RtpExtension::kTransportSequenceNumberUri, true,
+                          false);
   RunBaseTest(&test);
 }
 
 #endif
 
 TEST_F(RampUpTest, AbsSendTimeSingleStream) {
-  RampUpTester test(1, 0, 0, RtpExtension::kAbsSendTime, false, false);
+  RampUpTester test(1, 0, 0, RtpExtension::kAbsSendTimeUri, false, false);
   RunBaseTest(&test);
 }
 
 TEST_F(RampUpTest, AbsSendTimeSimulcast) {
-  RampUpTester test(3, 0, 0, RtpExtension::kAbsSendTime, false, false);
+  RampUpTester test(3, 0, 0, RtpExtension::kAbsSendTimeUri, false, false);
   RunBaseTest(&test);
 }
 
 TEST_F(RampUpTest, AbsSendTimeSimulcastWithRtx) {
-  RampUpTester test(3, 0, 0, RtpExtension::kAbsSendTime, true, false);
+  RampUpTester test(3, 0, 0, RtpExtension::kAbsSendTimeUri, true, false);
   RunBaseTest(&test);
 }
 
 TEST_F(RampUpTest, AbsSendTimeSimulcastByRedWithRtx) {
-  RampUpTester test(3, 0, 0, RtpExtension::kAbsSendTime, true, true);
+  RampUpTester test(3, 0, 0, RtpExtension::kAbsSendTimeUri, true, true);
   RunBaseTest(&test);
 }
 
 TEST_F(RampUpTest, AbsSendTimeSingleStreamWithHighStartBitrate) {
   RampUpTester test(1, 0, 0.9 * kSingleStreamTargetBps,
-                    RtpExtension::kAbsSendTime, false, false);
+                    RtpExtension::kAbsSendTimeUri, false, false);
   RunBaseTest(&test);
 }
 
 TEST_F(RampUpTest, TransportSequenceNumberSingleStream) {
-  RampUpTester test(1, 0, 0, RtpExtension::kTransportSequenceNumber, false,
+  RampUpTester test(1, 0, 0, RtpExtension::kTransportSequenceNumberUri, false,
                     false);
   RunBaseTest(&test);
 }
 
 TEST_F(RampUpTest, TransportSequenceNumberSimulcast) {
-  RampUpTester test(3, 0, 0, RtpExtension::kTransportSequenceNumber, false,
+  RampUpTester test(3, 0, 0, RtpExtension::kTransportSequenceNumberUri, false,
                     false);
   RunBaseTest(&test);
 }
 
 TEST_F(RampUpTest, TransportSequenceNumberSimulcastWithRtx) {
-  RampUpTester test(3, 0, 0, RtpExtension::kTransportSequenceNumber, true,
+  RampUpTester test(3, 0, 0, RtpExtension::kTransportSequenceNumberUri, true,
                     false);
   RunBaseTest(&test);
 }
 
 TEST_F(RampUpTest, AudioVideoTransportSequenceNumberSimulcastWithRtx) {
-  RampUpTester test(3, 1, 0, RtpExtension::kTransportSequenceNumber, true,
+  RampUpTester test(3, 1, 0, RtpExtension::kTransportSequenceNumberUri, true,
                     false);
   RunBaseTest(&test);
 }
 
 TEST_F(RampUpTest, TransportSequenceNumberSimulcastByRedWithRtx) {
-  RampUpTester test(3, 0, 0, RtpExtension::kTransportSequenceNumber, true,
+  RampUpTester test(3, 0, 0, RtpExtension::kTransportSequenceNumberUri, true,
                     true);
   RunBaseTest(&test);
 }
 
 TEST_F(RampUpTest, TransportSequenceNumberSingleStreamWithHighStartBitrate) {
   RampUpTester test(1, 0, 0.9 * kSingleStreamTargetBps,
-                    RtpExtension::kTransportSequenceNumber, false, false);
+                    RtpExtension::kTransportSequenceNumberUri, false, false);
   RunBaseTest(&test);
 }
 }  // namespace webrtc
diff --git a/webrtc/call/rtc_event_log.cc b/webrtc/call/rtc_event_log.cc
index 6dd02c8..07f461b 100644
--- a/webrtc/call/rtc_event_log.cc
+++ b/webrtc/call/rtc_event_log.cc
@@ -268,7 +268,7 @@
   for (const auto& e : config.rtp.extensions) {
     rtclog::RtpHeaderExtension* extension =
         receiver_config->add_header_extensions();
-    extension->set_name(e.name);
+    extension->set_name(e.uri);
     extension->set_id(e.id);
   }
 
@@ -297,7 +297,7 @@
   for (const auto& e : config.rtp.extensions) {
     rtclog::RtpHeaderExtension* extension =
         sender_config->add_header_extensions();
-    extension->set_name(e.name);
+    extension->set_name(e.uri);
     extension->set_id(e.id);
   }
 
diff --git a/webrtc/call/rtc_event_log_unittest.cc b/webrtc/call/rtc_event_log_unittest.cc
index 067c441..82f23a9 100644
--- a/webrtc/call/rtc_event_log_unittest.cc
+++ b/webrtc/call/rtc_event_log_unittest.cc
@@ -48,11 +48,10 @@
     RTPExtensionType::kRtpExtensionAbsoluteSendTime,
     RTPExtensionType::kRtpExtensionVideoRotation,
     RTPExtensionType::kRtpExtensionTransportSequenceNumber};
-const char* kExtensionNames[] = {RtpExtension::kTOffset,
-                                 RtpExtension::kAudioLevel,
-                                 RtpExtension::kAbsSendTime,
-                                 RtpExtension::kVideoRotation,
-                                 RtpExtension::kTransportSequenceNumber};
+const char* kExtensionNames[] = {
+    RtpExtension::kTimestampOffsetUri, RtpExtension::kAudioLevelUri,
+    RtpExtension::kAbsSendTimeUri, RtpExtension::kVideoRotationUri,
+    RtpExtension::kTransportSequenceNumberUri};
 const size_t kNumExtensions = 5;
 
 void PrintActualEvents(const ParsedRtcEventLog& parsed_log) {
diff --git a/webrtc/call/rtc_event_log_unittest_helper.cc b/webrtc/call/rtc_event_log_unittest_helper.cc
index 5a06d97..dcaeaf9 100644
--- a/webrtc/call/rtc_event_log_unittest_helper.cc
+++ b/webrtc/call/rtc_event_log_unittest_helper.cc
@@ -153,7 +153,7 @@
     const std::string& name = receiver_config.header_extensions(i).name();
     int id = receiver_config.header_extensions(i).id();
     EXPECT_EQ(config.rtp.extensions[i].id, id);
-    EXPECT_EQ(config.rtp.extensions[i].name, name);
+    EXPECT_EQ(config.rtp.extensions[i].uri, name);
   }
   // Check decoders.
   ASSERT_EQ(static_cast<int>(config.decoders.size()),
@@ -186,8 +186,8 @@
   // Check header extensions.
   EXPECT_EQ(config.rtp.extensions.size(), parsed_config.rtp.extensions.size());
   for (size_t i = 0; i < parsed_config.rtp.extensions.size(); i++) {
-    EXPECT_EQ(config.rtp.extensions[i].name,
-              parsed_config.rtp.extensions[i].name);
+    EXPECT_EQ(config.rtp.extensions[i].uri,
+              parsed_config.rtp.extensions[i].uri);
     EXPECT_EQ(config.rtp.extensions[i].id, parsed_config.rtp.extensions[i].id);
   }
   // Check decoders.
@@ -223,7 +223,7 @@
     const std::string& name = sender_config.header_extensions(i).name();
     int id = sender_config.header_extensions(i).id();
     EXPECT_EQ(config.rtp.extensions[i].id, id);
-    EXPECT_EQ(config.rtp.extensions[i].name, name);
+    EXPECT_EQ(config.rtp.extensions[i].uri, name);
   }
   // Check RTX settings.
   ASSERT_EQ(static_cast<int>(config.rtp.rtx.ssrcs.size()),
@@ -255,8 +255,8 @@
   // Check header extensions.
   EXPECT_EQ(config.rtp.extensions.size(), parsed_config.rtp.extensions.size());
   for (size_t i = 0; i < parsed_config.rtp.extensions.size(); i++) {
-    EXPECT_EQ(config.rtp.extensions[i].name,
-              parsed_config.rtp.extensions[i].name);
+    EXPECT_EQ(config.rtp.extensions[i].uri,
+              parsed_config.rtp.extensions[i].uri);
     EXPECT_EQ(config.rtp.extensions[i].id, parsed_config.rtp.extensions[i].id);
   }
   // Check RTX settings.
diff --git a/webrtc/config.cc b/webrtc/config.cc
index c8cb9ef..e9c56da 100644
--- a/webrtc/config.cc
+++ b/webrtc/config.cc
@@ -24,32 +24,42 @@
 
 std::string RtpExtension::ToString() const {
   std::stringstream ss;
-  ss << "{name: " << name;
+  ss << "{uri: " << uri;
   ss << ", id: " << id;
   ss << '}';
   return ss.str();
 }
 
-const char* RtpExtension::kTOffset = "urn:ietf:params:rtp-hdrext:toffset";
-const char* RtpExtension::kAbsSendTime =
-    "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time";
-const char* RtpExtension::kVideoRotation = "urn:3gpp:video-orientation";
-const char* RtpExtension::kAudioLevel =
+const char* RtpExtension::kAudioLevelUri =
     "urn:ietf:params:rtp-hdrext:ssrc-audio-level";
-const char* RtpExtension::kTransportSequenceNumber =
-    "http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01";
+const int RtpExtension::kAudioLevelDefaultId = 1;
 
-bool RtpExtension::IsSupportedForAudio(const std::string& name) {
-  return name == webrtc::RtpExtension::kAbsSendTime ||
-         name == webrtc::RtpExtension::kAudioLevel ||
-         name == webrtc::RtpExtension::kTransportSequenceNumber;
+const char* RtpExtension::kTimestampOffsetUri =
+    "urn:ietf:params:rtp-hdrext:toffset";
+const int RtpExtension::kTimestampOffsetDefaultId = 2;
+
+const char* RtpExtension::kAbsSendTimeUri =
+    "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time";
+const int RtpExtension::kAbsSendTimeDefaultId = 3;
+
+const char* RtpExtension::kVideoRotationUri = "urn:3gpp:video-orientation";
+const int RtpExtension::kVideoRotationDefaultId = 4;
+
+const char* RtpExtension::kTransportSequenceNumberUri =
+    "http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01";
+const int RtpExtension::kTransportSequenceNumberDefaultId = 5;
+
+bool RtpExtension::IsSupportedForAudio(const std::string& uri) {
+  return uri == webrtc::RtpExtension::kAbsSendTimeUri ||
+         uri == webrtc::RtpExtension::kAudioLevelUri ||
+         uri == webrtc::RtpExtension::kTransportSequenceNumberUri;
 }
 
-bool RtpExtension::IsSupportedForVideo(const std::string& name) {
-  return name == webrtc::RtpExtension::kTOffset ||
-         name == webrtc::RtpExtension::kAbsSendTime ||
-         name == webrtc::RtpExtension::kVideoRotation ||
-         name == webrtc::RtpExtension::kTransportSequenceNumber;
+bool RtpExtension::IsSupportedForVideo(const std::string& uri) {
+  return uri == webrtc::RtpExtension::kTimestampOffsetUri ||
+         uri == webrtc::RtpExtension::kAbsSendTimeUri ||
+         uri == webrtc::RtpExtension::kVideoRotationUri ||
+         uri == webrtc::RtpExtension::kTransportSequenceNumberUri;
 }
 
 VideoStream::VideoStream()
diff --git a/webrtc/config.h b/webrtc/config.h
index 06460ae..d5fd1fe 100644
--- a/webrtc/config.h
+++ b/webrtc/config.h
@@ -52,20 +52,42 @@
 
 // RTP header extension, see RFC 5285.
 struct RtpExtension {
-  RtpExtension(const std::string& name, int id) : name(name), id(id) {}
+  RtpExtension() : id(0) {}
+  RtpExtension(const std::string& uri, int id) : uri(uri), id(id) {}
   std::string ToString() const;
   bool operator==(const RtpExtension& rhs) const {
-    return name == rhs.name && id == rhs.id;
+    return uri == rhs.uri && id == rhs.id;
   }
-  static bool IsSupportedForAudio(const std::string& name);
-  static bool IsSupportedForVideo(const std::string& name);
+  static bool IsSupportedForAudio(const std::string& uri);
+  static bool IsSupportedForVideo(const std::string& uri);
 
-  static const char* kTOffset;
-  static const char* kAbsSendTime;
-  static const char* kVideoRotation;
-  static const char* kAudioLevel;
-  static const char* kTransportSequenceNumber;
-  std::string name;
+  // Header extension for audio levels, as defined in:
+  // http://tools.ietf.org/html/draft-ietf-avtext-client-to-mixer-audio-level-03
+  static const char* kAudioLevelUri;
+  static const int kAudioLevelDefaultId;
+
+  // Header extension for RTP timestamp offset, see RFC 5450 for details:
+  // http://tools.ietf.org/html/rfc5450
+  static const char* kTimestampOffsetUri;
+  static const int kTimestampOffsetDefaultId;
+
+  // Header extension for absolute send time, see url for details:
+  // http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
+  static const char* kAbsSendTimeUri;
+  static const int kAbsSendTimeDefaultId;
+
+  // Header extension for coordination of video orientation, see url for
+  // details:
+  // http://www.etsi.org/deliver/etsi_ts/126100_126199/126114/12.07.00_60/ts_126114v120700p.pdf
+  static const char* kVideoRotationUri;
+  static const int kVideoRotationDefaultId;
+
+  // Header extension for transport sequence number, see url for details:
+  // http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions
+  static const char* kTransportSequenceNumberUri;
+  static const int kTransportSequenceNumberDefaultId;
+
+  std::string uri;
   int id;
 };
 
diff --git a/webrtc/media/base/fakemediaengine.h b/webrtc/media/base/fakemediaengine.h
index bde5843..1e1ef6c 100644
--- a/webrtc/media/base/fakemediaengine.h
+++ b/webrtc/media/base/fakemediaengine.h
@@ -28,6 +28,8 @@
 #include "webrtc/media/base/streamparams.h"
 #include "webrtc/p2p/base/sessiondescription.h"
 
+using webrtc::RtpExtension;
+
 namespace cricket {
 
 class FakeMediaEngine;
@@ -44,10 +46,10 @@
         fail_set_recv_codecs_(false),
         send_ssrc_(0),
         ready_to_send_(false) {}
-  const std::vector<RtpHeaderExtension>& recv_extensions() {
+  const std::vector<RtpExtension>& recv_extensions() {
     return recv_extensions_;
   }
-  const std::vector<RtpHeaderExtension>& send_extensions() {
+  const std::vector<RtpExtension>& send_extensions() {
     return send_extensions_;
   }
   bool sending() const { return sending_; }
@@ -231,13 +233,11 @@
     return true;
   }
   void set_playout(bool playout) { playout_ = playout; }
-  bool SetRecvRtpHeaderExtensions(
-      const std::vector<RtpHeaderExtension>& extensions) {
+  bool SetRecvRtpHeaderExtensions(const std::vector<RtpExtension>& extensions) {
     recv_extensions_ = extensions;
     return true;
   }
-  bool SetSendRtpHeaderExtensions(
-      const std::vector<RtpHeaderExtension>& extensions) {
+  bool SetSendRtpHeaderExtensions(const std::vector<RtpExtension>& extensions) {
     send_extensions_ = extensions;
     return true;
   }
@@ -263,8 +263,8 @@
  private:
   bool sending_;
   bool playout_;
-  std::vector<RtpHeaderExtension> recv_extensions_;
-  std::vector<RtpHeaderExtension> send_extensions_;
+  std::vector<RtpExtension> recv_extensions_;
+  std::vector<RtpExtension> send_extensions_;
   std::list<std::string> rtp_packets_;
   std::list<std::string> rtcp_packets_;
   std::vector<StreamParams> send_streams_;
@@ -712,8 +712,7 @@
   void set_fail_create_channel(bool fail) { fail_create_channel_ = fail; }
 
   RtpCapabilities GetCapabilities() const { return capabilities_; }
-  void set_rtp_header_extensions(
-      const std::vector<RtpHeaderExtension>& extensions) {
+  void set_rtp_header_extensions(const std::vector<RtpExtension>& extensions) {
     capabilities_.header_extensions = extensions;
   }
 
@@ -854,11 +853,11 @@
   }
 
   void SetAudioRtpHeaderExtensions(
-      const std::vector<RtpHeaderExtension>& extensions) {
+      const std::vector<RtpExtension>& extensions) {
     voice_.set_rtp_header_extensions(extensions);
   }
   void SetVideoRtpHeaderExtensions(
-      const std::vector<RtpHeaderExtension>& extensions) {
+      const std::vector<RtpExtension>& extensions) {
     video_.set_rtp_header_extensions(extensions);
   }
 
diff --git a/webrtc/media/base/mediachannel.h b/webrtc/media/base/mediachannel.h
index 5434709..61e450d 100644
--- a/webrtc/media/base/mediachannel.h
+++ b/webrtc/media/base/mediachannel.h
@@ -26,6 +26,7 @@
 #include "webrtc/base/sigslot.h"
 #include "webrtc/base/socket.h"
 #include "webrtc/base/window.h"
+#include "webrtc/config.h"
 #include "webrtc/media/base/codec.h"
 #include "webrtc/media/base/mediaconstants.h"
 #include "webrtc/media/base/streamparams.h"
@@ -52,8 +53,6 @@
 struct RtpHeader;
 struct VideoFormat;
 
-const int kMinRtpHeaderExtensionId = 1;
-const int kMaxRtpHeaderExtensionId = 255;
 const int kScreencastDefaultFps = 5;
 
 template <class T>
@@ -321,44 +320,6 @@
   }
 };
 
-struct RtpHeaderExtension {
-  RtpHeaderExtension() : id(0) {}
-  RtpHeaderExtension(const std::string& u, int i) : uri(u), id(i) {}
-
-  bool operator==(const RtpHeaderExtension& ext) const {
-    // id is a reserved word in objective-c. Therefore the id attribute has to
-    // be a fully qualified name in order to compile on IOS.
-    return this->id == ext.id &&
-        uri == ext.uri;
-  }
-
-  std::string ToString() const {
-    std::ostringstream ost;
-    ost << "{";
-    ost << "uri: " << uri;
-    ost << ", id: " << id;
-    ost << "}";
-    return ost.str();
-  }
-
-  std::string uri;
-  int id;
-  // TODO(juberti): SendRecv direction;
-};
-
-// Returns the named header extension if found among all extensions, NULL
-// otherwise.
-inline const RtpHeaderExtension* FindHeaderExtension(
-    const std::vector<RtpHeaderExtension>& extensions,
-    const std::string& name) {
-  for (std::vector<RtpHeaderExtension>::const_iterator it = extensions.begin();
-       it != extensions.end(); ++it) {
-    if (it->uri == name)
-      return &(*it);
-  }
-  return NULL;
-}
-
 class MediaChannel : public sigslot::has_slots<> {
  public:
   class NetworkInterface {
@@ -842,7 +803,7 @@
   }
 
   std::vector<Codec> codecs;
-  std::vector<RtpHeaderExtension> extensions;
+  std::vector<webrtc::RtpExtension> extensions;
   // TODO(pthatcher): Add streams.
   RtcpParameters rtcp;
   virtual ~RtpParameters() = default;
diff --git a/webrtc/media/base/mediaconstants.cc b/webrtc/media/base/mediaconstants.cc
index a8e2b12..0f31864 100644
--- a/webrtc/media/base/mediaconstants.cc
+++ b/webrtc/media/base/mediaconstants.cc
@@ -91,27 +91,6 @@
 
 const char kComfortNoiseCodecName[] = "CN";
 
-const int kRtpAudioLevelHeaderExtensionDefaultId = 1;
-const char kRtpAudioLevelHeaderExtension[] =
-    "urn:ietf:params:rtp-hdrext:ssrc-audio-level";
-
-const int kRtpTimestampOffsetHeaderExtensionDefaultId = 2;
-const char kRtpTimestampOffsetHeaderExtension[] =
-    "urn:ietf:params:rtp-hdrext:toffset";
-
-const int kRtpAbsoluteSenderTimeHeaderExtensionDefaultId = 3;
-const char kRtpAbsoluteSenderTimeHeaderExtension[] =
-    "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time";
-
-const int kRtpVideoRotationHeaderExtensionDefaultId = 4;
-const char kRtpVideoRotationHeaderExtension[] = "urn:3gpp:video-orientation";
-const char kRtpVideoRotation6BitsHeaderExtensionForTesting[] =
-    "urn:3gpp:video-orientation:6";
-
-const int kRtpTransportSequenceNumberHeaderExtensionDefaultId = 5;
-const char kRtpTransportSequenceNumberHeaderExtension[] =
-    "http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01";
-
 const char kVp8CodecName[] = "VP8";
 const char kVp9CodecName[] = "VP9";
 const char kH264CodecName[] = "H264";
diff --git a/webrtc/media/base/mediaconstants.h b/webrtc/media/base/mediaconstants.h
index 708ca5b..e12ad41 100644
--- a/webrtc/media/base/mediaconstants.h
+++ b/webrtc/media/base/mediaconstants.h
@@ -117,34 +117,6 @@
 
 extern const char kComfortNoiseCodecName[];
 
-// Header extension for audio levels, as defined in
-// http://tools.ietf.org/html/draft-ietf-avtext-client-to-mixer-audio-level-03
-extern const int kRtpAudioLevelHeaderExtensionDefaultId;
-extern const char kRtpAudioLevelHeaderExtension[];
-
-// Header extension for RTP timestamp offset, see RFC 5450 for details:
-// http://tools.ietf.org/html/rfc5450
-extern const int kRtpTimestampOffsetHeaderExtensionDefaultId;
-extern const char kRtpTimestampOffsetHeaderExtension[];
-
-// Header extension for absolute send time, see url for details:
-// http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
-extern const int kRtpAbsoluteSenderTimeHeaderExtensionDefaultId;
-extern const char kRtpAbsoluteSenderTimeHeaderExtension[];
-
-// Header extension for coordination of video orientation, see url for details:
-// http://www.etsi.org/deliver/etsi_ts/126100_126199/126114/12.07.00_60/
-// ts_126114v120700p.pdf
-extern const int kRtpVideoRotationHeaderExtensionDefaultId;
-extern const char kRtpVideoRotationHeaderExtension[];
-// We don't support 6 bit CVO. Added here for testing purpose.
-extern const char kRtpVideoRotation6BitsHeaderExtensionForTesting[];
-
-// Header extension for transport sequence number, see url for details:
-// http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions
-extern const int kRtpTransportSequenceNumberHeaderExtensionDefaultId;
-extern const char kRtpTransportSequenceNumberHeaderExtension[];
-
 extern const char kVp8CodecName[];
 extern const char kVp9CodecName[];
 extern const char kH264CodecName[];
diff --git a/webrtc/media/base/mediaengine.h b/webrtc/media/base/mediaengine.h
index 4446bd6..8e31c7c 100644
--- a/webrtc/media/base/mediaengine.h
+++ b/webrtc/media/base/mediaengine.h
@@ -42,7 +42,7 @@
 class VideoCapturer;
 
 struct RtpCapabilities {
-  std::vector<RtpHeaderExtension> header_extensions;
+  std::vector<webrtc::RtpExtension> header_extensions;
 };
 
 // MediaEngineInterface is an abstraction of a media engine which can be
diff --git a/webrtc/media/engine/webrtcmediaengine.cc b/webrtc/media/engine/webrtcmediaengine.cc
index 45652d0..f452b74 100644
--- a/webrtc/media/engine/webrtcmediaengine.cc
+++ b/webrtc/media/engine/webrtcmediaengine.cc
@@ -73,11 +73,10 @@
     rtc::ArrayView<const char*> extensions_decreasing_prio) {
   RTC_DCHECK(extensions);
   bool found = false;
-  for (const char* name : extensions_decreasing_prio) {
-    auto it = std::find_if(extensions->begin(), extensions->end(),
-        [name](const webrtc::RtpExtension& rhs) {
-          return rhs.name == name;
-        });
+  for (const char* uri : extensions_decreasing_prio) {
+    auto it = std::find_if(
+        extensions->begin(), extensions->end(),
+        [uri](const webrtc::RtpExtension& rhs) { return rhs.uri == uri; });
     if (it != extensions->end()) {
       if (found) {
         extensions->erase(it);
@@ -88,7 +87,8 @@
 }
 }  // namespace
 
-bool ValidateRtpExtensions(const std::vector<RtpHeaderExtension>& extensions) {
+bool ValidateRtpExtensions(
+    const std::vector<webrtc::RtpExtension>& extensions) {
   bool id_used[14] = {false};
   for (const auto& extension : extensions) {
     if (extension.id <= 0 || extension.id >= 15) {
@@ -105,7 +105,7 @@
 }
 
 std::vector<webrtc::RtpExtension> FilterRtpExtensions(
-    const std::vector<RtpHeaderExtension>& extensions,
+    const std::vector<webrtc::RtpExtension>& extensions,
     bool (*supported)(const std::string&),
     bool filter_redundant_extensions) {
   RTC_DCHECK(ValidateRtpExtensions(extensions));
@@ -115,7 +115,7 @@
   // Ignore any extensions that we don't recognize.
   for (const auto& extension : extensions) {
     if (supported(extension.uri)) {
-      result.push_back({extension.uri, extension.id});
+      result.push_back(extension);
     } else {
       LOG(LS_WARNING) << "Unsupported RTP extension: " << extension.ToString();
     }
@@ -124,24 +124,23 @@
   // Sort by name, ascending, so that we don't reset extensions if they were
   // specified in a different order (also allows us to use std::unique below).
   std::sort(result.begin(), result.end(),
-      [](const webrtc::RtpExtension& rhs, const webrtc::RtpExtension& lhs) {
-        return rhs.name < lhs.name;
-      });
+            [](const webrtc::RtpExtension& rhs,
+               const webrtc::RtpExtension& lhs) { return rhs.uri < lhs.uri; });
 
   // Remove unnecessary extensions (used on send side).
   if (filter_redundant_extensions) {
-    auto it = std::unique(result.begin(), result.end(),
+    auto it = std::unique(
+        result.begin(), result.end(),
         [](const webrtc::RtpExtension& rhs, const webrtc::RtpExtension& lhs) {
-          return rhs.name == lhs.name;
+          return rhs.uri == lhs.uri;
         });
     result.erase(it, result.end());
 
     // Keep just the highest priority extension of any in the following list.
     static const char* kBweExtensionPriorities[] = {
-      kRtpTransportSequenceNumberHeaderExtension,
-      kRtpAbsoluteSenderTimeHeaderExtension,
-      kRtpTimestampOffsetHeaderExtension
-    };
+        webrtc::RtpExtension::kTransportSequenceNumberUri,
+        webrtc::RtpExtension::kAbsSendTimeUri,
+        webrtc::RtpExtension::kTimestampOffsetUri};
     DiscardRedundantExtensions(&result, kBweExtensionPriorities);
   }
 
diff --git a/webrtc/media/engine/webrtcmediaengine.h b/webrtc/media/engine/webrtcmediaengine.h
index 19b7d22..8aad94c 100644
--- a/webrtc/media/engine/webrtcmediaengine.h
+++ b/webrtc/media/engine/webrtcmediaengine.h
@@ -37,14 +37,13 @@
 
 // Verify that extension IDs are within 1-byte extension range and are not
 // overlapping.
-bool ValidateRtpExtensions(const std::vector<RtpHeaderExtension>& extensions);
+bool ValidateRtpExtensions(const std::vector<webrtc::RtpExtension>& extensions);
 
-// Convert cricket::RtpHeaderExtension:s to webrtc::RtpExtension:s, discarding
-// any extensions not validated by the 'supported' predicate. Duplicate
+// Discard any extensions not validated by the 'supported' predicate. Duplicate
 // extensions are removed if 'filter_redundant_extensions' is set, and also any
-// mutually exclusive extensions (see implementation for details).
+// mutually exclusive extensions (see implementation for details) are removed.
 std::vector<webrtc::RtpExtension> FilterRtpExtensions(
-    const std::vector<RtpHeaderExtension>& extensions,
+    const std::vector<webrtc::RtpExtension>& extensions,
     bool (*supported)(const std::string&),
     bool filter_redundant_extensions);
 
diff --git a/webrtc/media/engine/webrtcmediaengine_unittest.cc b/webrtc/media/engine/webrtcmediaengine_unittest.cc
index be93d7d..f7ae7db 100644
--- a/webrtc/media/engine/webrtcmediaengine_unittest.cc
+++ b/webrtc/media/engine/webrtcmediaengine_unittest.cc
@@ -12,27 +12,29 @@
 
 #include "webrtc/media/engine/webrtcmediaengine.h"
 
+using webrtc::RtpExtension;
+
 namespace cricket {
 namespace {
 
-std::vector<RtpHeaderExtension> MakeUniqueExtensions() {
-  std::vector<RtpHeaderExtension> result;
+std::vector<RtpExtension> MakeUniqueExtensions() {
+  std::vector<RtpExtension> result;
   char name[] = "a";
   for (int i = 0; i < 7; ++i) {
-    result.push_back(RtpHeaderExtension(name, 1 + i));
+    result.push_back(RtpExtension(name, 1 + i));
     name[0]++;
-    result.push_back(RtpHeaderExtension(name, 14 - i));
+    result.push_back(RtpExtension(name, 14 - i));
     name[0]++;
   }
   return result;
 }
 
-std::vector<RtpHeaderExtension> MakeRedundantExtensions() {
-  std::vector<RtpHeaderExtension> result;
+std::vector<RtpExtension> MakeRedundantExtensions() {
+  std::vector<RtpExtension> result;
   char name[] = "a";
   for (int i = 0; i < 7; ++i) {
-    result.push_back(RtpHeaderExtension(name, 1 + i));
-    result.push_back(RtpHeaderExtension(name, 14 - i));
+    result.push_back(RtpExtension(name, 1 + i));
+    result.push_back(RtpExtension(name, 14 - i));
     name[0]++;
   }
   return result;
@@ -49,67 +51,67 @@
 bool IsSorted(const std::vector<webrtc::RtpExtension>& extensions) {
   const std::string* last = nullptr;
   for (const auto& extension : extensions) {
-    if (last && *last > extension.name) {
+    if (last && *last > extension.uri) {
       return false;
     }
-    last = &extension.name;
+    last = &extension.uri;
   }
   return true;
 }
 }  // namespace
 
 TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_EmptyList) {
-  std::vector<RtpHeaderExtension> extensions;
+  std::vector<RtpExtension> extensions;
   EXPECT_TRUE(ValidateRtpExtensions(extensions));
 }
 
 TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_AllGood) {
-  std::vector<RtpHeaderExtension> extensions = MakeUniqueExtensions();
+  std::vector<RtpExtension> extensions = MakeUniqueExtensions();
   EXPECT_TRUE(ValidateRtpExtensions(extensions));
 }
 
 TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OutOfRangeId_Low) {
-  std::vector<RtpHeaderExtension> extensions = MakeUniqueExtensions();
-  extensions.push_back(RtpHeaderExtension("foo", 0));
+  std::vector<RtpExtension> extensions = MakeUniqueExtensions();
+  extensions.push_back(RtpExtension("foo", 0));
   EXPECT_FALSE(ValidateRtpExtensions(extensions));
 }
 
 TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OutOfRangeId_High) {
-  std::vector<RtpHeaderExtension> extensions = MakeUniqueExtensions();
-  extensions.push_back(RtpHeaderExtension("foo", 15));
+  std::vector<RtpExtension> extensions = MakeUniqueExtensions();
+  extensions.push_back(RtpExtension("foo", 15));
   EXPECT_FALSE(ValidateRtpExtensions(extensions));
 }
 
 TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OverlappingIds_StartOfSet) {
-  std::vector<RtpHeaderExtension> extensions = MakeUniqueExtensions();
-  extensions.push_back(RtpHeaderExtension("foo", 1));
+  std::vector<RtpExtension> extensions = MakeUniqueExtensions();
+  extensions.push_back(RtpExtension("foo", 1));
   EXPECT_FALSE(ValidateRtpExtensions(extensions));
 }
 
 TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OverlappingIds_EndOfSet) {
-  std::vector<RtpHeaderExtension> extensions = MakeUniqueExtensions();
-  extensions.push_back(RtpHeaderExtension("foo", 14));
+  std::vector<RtpExtension> extensions = MakeUniqueExtensions();
+  extensions.push_back(RtpExtension("foo", 14));
   EXPECT_FALSE(ValidateRtpExtensions(extensions));
 }
 
 TEST(WebRtcMediaEngineTest, FilterRtpExtensions_EmptyList) {
-  std::vector<RtpHeaderExtension> extensions;
+  std::vector<RtpExtension> extensions;
   std::vector<webrtc::RtpExtension> filtered =
       FilterRtpExtensions(extensions, SupportedExtensions1, true);
   EXPECT_EQ(0, filtered.size());
 }
 
 TEST(WebRtcMediaEngineTest, FilterRtpExtensions_IncludeOnlySupported) {
-  std::vector<RtpHeaderExtension> extensions = MakeUniqueExtensions();
+  std::vector<RtpExtension> extensions = MakeUniqueExtensions();
   std::vector<webrtc::RtpExtension> filtered =
       FilterRtpExtensions(extensions, SupportedExtensions1, false);
   EXPECT_EQ(2, filtered.size());
-  EXPECT_EQ("c", filtered[0].name);
-  EXPECT_EQ("i", filtered[1].name);
+  EXPECT_EQ("c", filtered[0].uri);
+  EXPECT_EQ("i", filtered[1].uri);
 }
 
 TEST(WebRtcMediaEngineTest, FilterRtpExtensions_SortedByName_1) {
-  std::vector<RtpHeaderExtension> extensions = MakeUniqueExtensions();
+  std::vector<RtpExtension> extensions = MakeUniqueExtensions();
   std::vector<webrtc::RtpExtension> filtered =
       FilterRtpExtensions(extensions, SupportedExtensions2, false);
   EXPECT_EQ(12, filtered.size());
@@ -117,7 +119,7 @@
 }
 
 TEST(WebRtcMediaEngineTest, FilterRtpExtensions_SortedByName_2) {
-  std::vector<RtpHeaderExtension> extensions = MakeUniqueExtensions();
+  std::vector<RtpExtension> extensions = MakeUniqueExtensions();
   std::vector<webrtc::RtpExtension> filtered =
       FilterRtpExtensions(extensions, SupportedExtensions2, true);
   EXPECT_EQ(12, filtered.size());
@@ -125,64 +127,56 @@
 }
 
 TEST(WebRtcMediaEngineTest, FilterRtpExtensions_DontRemoveRedundant) {
-  std::vector<RtpHeaderExtension> extensions = MakeRedundantExtensions();
+  std::vector<RtpExtension> extensions = MakeRedundantExtensions();
   std::vector<webrtc::RtpExtension> filtered =
       FilterRtpExtensions(extensions, SupportedExtensions2, false);
   EXPECT_EQ(12, filtered.size());
   EXPECT_TRUE(IsSorted(filtered));
-  EXPECT_EQ(filtered[0].name, filtered[1].name);
+  EXPECT_EQ(filtered[0].uri, filtered[1].uri);
 }
 
 TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundant) {
-  std::vector<RtpHeaderExtension> extensions = MakeRedundantExtensions();
+  std::vector<RtpExtension> extensions = MakeRedundantExtensions();
   std::vector<webrtc::RtpExtension> filtered =
       FilterRtpExtensions(extensions, SupportedExtensions2, true);
   EXPECT_EQ(6, filtered.size());
   EXPECT_TRUE(IsSorted(filtered));
-  EXPECT_NE(filtered[0].name, filtered[1].name);
+  EXPECT_NE(filtered[0].uri, filtered[1].uri);
 }
 
 TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_1) {
-  std::vector<RtpHeaderExtension> extensions;
+  std::vector<RtpExtension> extensions;
   extensions.push_back(
-      RtpHeaderExtension(kRtpTransportSequenceNumberHeaderExtension, 3));
+      RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
+  extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
+  extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
   extensions.push_back(
-      RtpHeaderExtension(kRtpTimestampOffsetHeaderExtension, 9));
-  extensions.push_back(
-      RtpHeaderExtension(kRtpAbsoluteSenderTimeHeaderExtension, 6));
-  extensions.push_back(
-      RtpHeaderExtension(kRtpTransportSequenceNumberHeaderExtension, 1));
-  extensions.push_back(
-      RtpHeaderExtension(kRtpTimestampOffsetHeaderExtension, 14));
+      RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
+  extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
   std::vector<webrtc::RtpExtension> filtered =
       FilterRtpExtensions(extensions, SupportedExtensions2, true);
   EXPECT_EQ(1, filtered.size());
-  EXPECT_EQ(kRtpTransportSequenceNumberHeaderExtension, filtered[0].name);
+  EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
 }
 
 TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_2) {
-  std::vector<RtpHeaderExtension> extensions;
-  extensions.push_back(
-      RtpHeaderExtension(kRtpTimestampOffsetHeaderExtension, 1));
-  extensions.push_back(
-      RtpHeaderExtension(kRtpAbsoluteSenderTimeHeaderExtension, 14));
-  extensions.push_back(
-      RtpHeaderExtension(kRtpTimestampOffsetHeaderExtension, 7));
+  std::vector<RtpExtension> extensions;
+  extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 1));
+  extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 14));
+  extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 7));
   std::vector<webrtc::RtpExtension> filtered =
       FilterRtpExtensions(extensions, SupportedExtensions2, true);
   EXPECT_EQ(1, filtered.size());
-  EXPECT_EQ(kRtpAbsoluteSenderTimeHeaderExtension, filtered[0].name);
+  EXPECT_EQ(RtpExtension::kAbsSendTimeUri, filtered[0].uri);
 }
 
 TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_3) {
-  std::vector<RtpHeaderExtension> extensions;
-  extensions.push_back(
-      RtpHeaderExtension(kRtpTimestampOffsetHeaderExtension, 2));
-  extensions.push_back(
-      RtpHeaderExtension(kRtpTimestampOffsetHeaderExtension, 14));
+  std::vector<RtpExtension> extensions;
+  extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 2));
+  extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
   std::vector<webrtc::RtpExtension> filtered =
       FilterRtpExtensions(extensions, SupportedExtensions2, true);
   EXPECT_EQ(1, filtered.size());
-  EXPECT_EQ(kRtpTimestampOffsetHeaderExtension, filtered[0].name);
+  EXPECT_EQ(RtpExtension::kTimestampOffsetUri, filtered[0].uri);
 }
 }  // namespace cricket
diff --git a/webrtc/media/engine/webrtcvideoengine2.cc b/webrtc/media/engine/webrtcvideoengine2.cc
index d81c849..2ea11b9 100644
--- a/webrtc/media/engine/webrtcvideoengine2.cc
+++ b/webrtc/media/engine/webrtcvideoengine2.cc
@@ -254,9 +254,9 @@
 
 inline bool ContainsHeaderExtension(
     const std::vector<webrtc::RtpExtension>& extensions,
-    const std::string& name) {
+    const std::string& uri) {
   for (const auto& kv : extensions) {
-    if (kv.name == name) {
+    if (kv.uri == uri) {
       return true;
     }
   }
@@ -551,18 +551,18 @@
 RtpCapabilities WebRtcVideoEngine2::GetCapabilities() const {
   RtpCapabilities capabilities;
   capabilities.header_extensions.push_back(
-      RtpHeaderExtension(kRtpTimestampOffsetHeaderExtension,
-                         kRtpTimestampOffsetHeaderExtensionDefaultId));
+      webrtc::RtpExtension(webrtc::RtpExtension::kTimestampOffsetUri,
+                           webrtc::RtpExtension::kTimestampOffsetDefaultId));
   capabilities.header_extensions.push_back(
-      RtpHeaderExtension(kRtpAbsoluteSenderTimeHeaderExtension,
-                         kRtpAbsoluteSenderTimeHeaderExtensionDefaultId));
+      webrtc::RtpExtension(webrtc::RtpExtension::kAbsSendTimeUri,
+                           webrtc::RtpExtension::kAbsSendTimeDefaultId));
   capabilities.header_extensions.push_back(
-      RtpHeaderExtension(kRtpVideoRotationHeaderExtension,
-                         kRtpVideoRotationHeaderExtensionDefaultId));
+      webrtc::RtpExtension(webrtc::RtpExtension::kVideoRotationUri,
+                           webrtc::RtpExtension::kVideoRotationDefaultId));
   if (webrtc::field_trial::FindFullName("WebRTC-SendSideBwe") == "Enabled") {
-    capabilities.header_extensions.push_back(RtpHeaderExtension(
-        kRtpTransportSequenceNumberHeaderExtension,
-        kRtpTransportSequenceNumberHeaderExtensionDefaultId));
+    capabilities.header_extensions.push_back(webrtc::RtpExtension(
+        webrtc::RtpExtension::kTransportSequenceNumberUri,
+        webrtc::RtpExtension::kTransportSequenceNumberDefaultId));
   }
   return capabilities;
 }
@@ -1570,7 +1570,7 @@
       enable_cpu_overuse_detection ? this : nullptr;
 
   sink_wants_.rotation_applied = !ContainsHeaderExtension(
-      rtp_extensions, kRtpVideoRotationHeaderExtension);
+      rtp_extensions, webrtc::RtpExtension::kVideoRotationUri);
 
   if (codec_settings) {
     SetCodec(*codec_settings);
@@ -1854,7 +1854,7 @@
   // that might cause a lock order inversion.
   if (params.rtp_header_extensions) {
     sink_wants_.rotation_applied = !ContainsHeaderExtension(
-        *params.rtp_header_extensions, kRtpVideoRotationHeaderExtension);
+        *params.rtp_header_extensions, webrtc::RtpExtension::kVideoRotationUri);
     if (source_) {
       source_->AddOrUpdateSink(this, sink_wants_);
     }
diff --git a/webrtc/media/engine/webrtcvideoengine2_unittest.cc b/webrtc/media/engine/webrtcvideoengine2_unittest.cc
index 22e3f99..177ab9f 100644
--- a/webrtc/media/engine/webrtcvideoengine2_unittest.cc
+++ b/webrtc/media/engine/webrtcvideoengine2_unittest.cc
@@ -27,6 +27,8 @@
 #include "webrtc/test/field_trial.h"
 #include "webrtc/video_encoder.h"
 
+using webrtc::RtpExtension;
+
 namespace {
 static const int kDefaultQpMax = 56;
 static const int kDefaultFramerate = 30;
@@ -182,9 +184,9 @@
 TEST_F(WebRtcVideoEngine2Test, SupportsTimestampOffsetHeaderExtension) {
   RtpCapabilities capabilities = engine_.GetCapabilities();
   ASSERT_FALSE(capabilities.header_extensions.empty());
-  for (const RtpHeaderExtension& extension : capabilities.header_extensions) {
-    if (extension.uri == kRtpTimestampOffsetHeaderExtension) {
-      EXPECT_EQ(kRtpTimestampOffsetHeaderExtensionDefaultId, extension.id);
+  for (const RtpExtension& extension : capabilities.header_extensions) {
+    if (extension.uri == RtpExtension::kTimestampOffsetUri) {
+      EXPECT_EQ(RtpExtension::kTimestampOffsetDefaultId, extension.id);
       return;
     }
   }
@@ -194,9 +196,9 @@
 TEST_F(WebRtcVideoEngine2Test, SupportsAbsoluteSenderTimeHeaderExtension) {
   RtpCapabilities capabilities = engine_.GetCapabilities();
   ASSERT_FALSE(capabilities.header_extensions.empty());
-  for (const RtpHeaderExtension& extension : capabilities.header_extensions) {
-    if (extension.uri == kRtpAbsoluteSenderTimeHeaderExtension) {
-      EXPECT_EQ(kRtpAbsoluteSenderTimeHeaderExtensionDefaultId, extension.id);
+  for (const RtpExtension& extension : capabilities.header_extensions) {
+    if (extension.uri == RtpExtension::kAbsSendTimeUri) {
+      EXPECT_EQ(RtpExtension::kAbsSendTimeDefaultId, extension.id);
       return;
     }
   }
@@ -213,10 +215,9 @@
        SupportsTransportSequenceNumberHeaderExtension) {
   RtpCapabilities capabilities = engine_.GetCapabilities();
   ASSERT_FALSE(capabilities.header_extensions.empty());
-  for (const RtpHeaderExtension& extension : capabilities.header_extensions) {
-    if (extension.uri == kRtpTransportSequenceNumberHeaderExtension) {
-      EXPECT_EQ(kRtpTransportSequenceNumberHeaderExtensionDefaultId,
-                extension.id);
+  for (const RtpExtension& extension : capabilities.header_extensions) {
+    if (extension.uri == RtpExtension::kTransportSequenceNumberUri) {
+      EXPECT_EQ(RtpExtension::kTransportSequenceNumberDefaultId, extension.id);
       return;
     }
   }
@@ -226,9 +227,9 @@
 TEST_F(WebRtcVideoEngine2Test, SupportsVideoRotationHeaderExtension) {
   RtpCapabilities capabilities = engine_.GetCapabilities();
   ASSERT_FALSE(capabilities.header_extensions.empty());
-  for (const RtpHeaderExtension& extension : capabilities.header_extensions) {
-    if (extension.uri == kRtpVideoRotationHeaderExtension) {
-      EXPECT_EQ(kRtpVideoRotationHeaderExtensionDefaultId, extension.id);
+  for (const RtpExtension& extension : capabilities.header_extensions) {
+    if (extension.uri == RtpExtension::kVideoRotationUri) {
+      EXPECT_EQ(RtpExtension::kVideoRotationDefaultId, extension.id);
       return;
     }
   }
@@ -252,7 +253,7 @@
   // Add CVO extension.
   const int id = 1;
   parameters.extensions.push_back(
-      cricket::RtpHeaderExtension(kRtpVideoRotationHeaderExtension, id));
+      RtpExtension(RtpExtension::kVideoRotationUri, id));
   EXPECT_TRUE(channel->SetSendParameters(parameters));
 
   // Set capturer.
@@ -282,7 +283,7 @@
   // Add CVO extension.
   const int id = 1;
   parameters.extensions.push_back(
-      cricket::RtpHeaderExtension(kRtpVideoRotationHeaderExtension, id));
+      RtpExtension(RtpExtension::kVideoRotationUri, id));
   EXPECT_TRUE(channel->SetSendParameters(parameters));
   EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(kSsrc)));
 
@@ -316,7 +317,7 @@
   // Add CVO extension.
   const int id = 1;
   parameters.extensions.push_back(
-      cricket::RtpHeaderExtension(kRtpVideoRotationHeaderExtension, id));
+      RtpExtension(RtpExtension::kVideoRotationUri, id));
   // Also remove the first codec to trigger a codec change as well.
   parameters.codecs.erase(parameters.codecs.begin());
   EXPECT_TRUE(channel->SetSendParameters(parameters));
@@ -967,13 +968,11 @@
               fake_call_->GetConfig().bitrate_config.max_bitrate_bps);
   }
 
-  void TestSetSendRtpHeaderExtensions(const std::string& cricket_ext,
-                                      const std::string& webrtc_ext) {
+  void TestSetSendRtpHeaderExtensions(const std::string& ext_uri) {
     // Enable extension.
     const int id = 1;
     cricket::VideoSendParameters parameters = send_parameters_;
-    parameters.extensions.push_back(
-        cricket::RtpHeaderExtension(cricket_ext, id));
+    parameters.extensions.push_back(RtpExtension(ext_uri, id));
     EXPECT_TRUE(channel_->SetSendParameters(parameters));
     FakeVideoSendStream* send_stream =
         AddSendStream(cricket::StreamParams::CreateLegacy(123));
@@ -981,7 +980,7 @@
     // Verify the send extension id.
     ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
     EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id);
-    EXPECT_EQ(webrtc_ext, send_stream->GetConfig().rtp.extensions[0].name);
+    EXPECT_EQ(ext_uri, send_stream->GetConfig().rtp.extensions[0].uri);
     // Verify call with same set of extensions returns true.
     EXPECT_TRUE(channel_->SetSendParameters(parameters));
     // Verify that SetSendRtpHeaderExtensions doesn't implicitly add them for
@@ -1002,16 +1001,14 @@
     send_stream = fake_call_->GetVideoSendStreams()[0];
     ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
     EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id);
-    EXPECT_EQ(webrtc_ext, send_stream->GetConfig().rtp.extensions[0].name);
+    EXPECT_EQ(ext_uri, send_stream->GetConfig().rtp.extensions[0].uri);
   }
 
-  void TestSetRecvRtpHeaderExtensions(const std::string& cricket_ext,
-                                      const std::string& webrtc_ext) {
+  void TestSetRecvRtpHeaderExtensions(const std::string& ext_uri) {
     // Enable extension.
     const int id = 1;
     cricket::VideoRecvParameters parameters = recv_parameters_;
-    parameters.extensions.push_back(
-        cricket::RtpHeaderExtension(cricket_ext, id));
+    parameters.extensions.push_back(RtpExtension(ext_uri, id));
     EXPECT_TRUE(channel_->SetRecvParameters(parameters));
 
     FakeVideoReceiveStream* recv_stream =
@@ -1020,7 +1017,7 @@
     // Verify the recv extension id.
     ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
     EXPECT_EQ(id, recv_stream->GetConfig().rtp.extensions[0].id);
-    EXPECT_EQ(webrtc_ext, recv_stream->GetConfig().rtp.extensions[0].name);
+    EXPECT_EQ(ext_uri, recv_stream->GetConfig().rtp.extensions[0].uri);
     // Verify call with same set of extensions returns true.
     EXPECT_TRUE(channel_->SetRecvParameters(parameters));
 
@@ -1042,7 +1039,7 @@
     recv_stream = fake_call_->GetVideoReceiveStreams()[0];
     ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
     EXPECT_EQ(id, recv_stream->GetConfig().rtp.extensions[0].id);
-    EXPECT_EQ(webrtc_ext, recv_stream->GetConfig().rtp.extensions[0].name);
+    EXPECT_EQ(ext_uri, recv_stream->GetConfig().rtp.extensions[0].uri);
   }
 
   void TestExtensionFilter(const std::vector<std::string>& extensions,
@@ -1053,8 +1050,7 @@
     for (const std::string& extension : extensions) {
       if (extension == expected_extension)
         expected_id = id;
-      parameters.extensions.push_back(
-          cricket::RtpHeaderExtension(extension, id++));
+      parameters.extensions.push_back(RtpExtension(extension, id++));
     }
     EXPECT_TRUE(channel_->SetSendParameters(parameters));
     FakeVideoSendStream* send_stream =
@@ -1065,7 +1061,7 @@
     ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
     EXPECT_EQ(expected_id, send_stream->GetConfig().rtp.extensions[0].id);
     EXPECT_EQ(expected_extension,
-              send_stream->GetConfig().rtp.extensions[0].name);
+              send_stream->GetConfig().rtp.extensions[0].uri);
   }
 
   void TestCpuAdaptation(bool enable_overuse, bool is_screenshare);
@@ -1220,39 +1216,37 @@
 
 // Test support for RTP timestamp offset header extension.
 TEST_F(WebRtcVideoChannel2Test, SendRtpTimestampOffsetHeaderExtensions) {
-  TestSetSendRtpHeaderExtensions(kRtpTimestampOffsetHeaderExtension,
-                                 webrtc::RtpExtension::kTOffset);
+  TestSetSendRtpHeaderExtensions(RtpExtension::kTimestampOffsetUri);
 }
+
 TEST_F(WebRtcVideoChannel2Test, RecvRtpTimestampOffsetHeaderExtensions) {
-  TestSetRecvRtpHeaderExtensions(kRtpTimestampOffsetHeaderExtension,
-                                 webrtc::RtpExtension::kTOffset);
+  TestSetRecvRtpHeaderExtensions(RtpExtension::kTimestampOffsetUri);
 }
 
 // Test support for absolute send time header extension.
 TEST_F(WebRtcVideoChannel2Test, SendAbsoluteSendTimeHeaderExtensions) {
-  TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension,
-                                 webrtc::RtpExtension::kAbsSendTime);
+  TestSetSendRtpHeaderExtensions(RtpExtension::kAbsSendTimeUri);
 }
+
 TEST_F(WebRtcVideoChannel2Test, RecvAbsoluteSendTimeHeaderExtensions) {
-  TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension,
-                                 webrtc::RtpExtension::kAbsSendTime);
+  TestSetRecvRtpHeaderExtensions(RtpExtension::kAbsSendTimeUri);
 }
 
 TEST_F(WebRtcVideoChannel2Test, FiltersExtensionsPicksTransportSeqNum) {
   // Enable three redundant extensions.
   std::vector<std::string> extensions;
-  extensions.push_back(kRtpAbsoluteSenderTimeHeaderExtension);
-  extensions.push_back(kRtpTimestampOffsetHeaderExtension);
-  extensions.push_back(kRtpTransportSequenceNumberHeaderExtension);
-  TestExtensionFilter(extensions, kRtpTransportSequenceNumberHeaderExtension);
+  extensions.push_back(RtpExtension::kAbsSendTimeUri);
+  extensions.push_back(RtpExtension::kTimestampOffsetUri);
+  extensions.push_back(RtpExtension::kTransportSequenceNumberUri);
+  TestExtensionFilter(extensions, RtpExtension::kTransportSequenceNumberUri);
 }
 
 TEST_F(WebRtcVideoChannel2Test, FiltersExtensionsPicksAbsSendTime) {
   // Enable two redundant extensions.
   std::vector<std::string> extensions;
-  extensions.push_back(kRtpAbsoluteSenderTimeHeaderExtension);
-  extensions.push_back(kRtpTimestampOffsetHeaderExtension);
-  TestExtensionFilter(extensions, kRtpAbsoluteSenderTimeHeaderExtension);
+  extensions.push_back(RtpExtension::kAbsSendTimeUri);
+  extensions.push_back(RtpExtension::kTimestampOffsetUri);
+  TestExtensionFilter(extensions, RtpExtension::kAbsSendTimeUri);
 }
 
 class WebRtcVideoChannel2WithSendSideBweTest : public WebRtcVideoChannel2Test {
@@ -1264,34 +1258,28 @@
 // Test support for transport sequence number header extension.
 TEST_F(WebRtcVideoChannel2WithSendSideBweTest,
        SendTransportSequenceNumberHeaderExtensions) {
-  TestSetSendRtpHeaderExtensions(
-      kRtpTransportSequenceNumberHeaderExtension,
-      webrtc::RtpExtension::kTransportSequenceNumber);
+  TestSetSendRtpHeaderExtensions(RtpExtension::kTransportSequenceNumberUri);
 }
 TEST_F(WebRtcVideoChannel2WithSendSideBweTest,
        RecvTransportSequenceNumberHeaderExtensions) {
-  TestSetRecvRtpHeaderExtensions(
-      kRtpTransportSequenceNumberHeaderExtension,
-      webrtc::RtpExtension::kTransportSequenceNumber);
+  TestSetRecvRtpHeaderExtensions(RtpExtension::kTransportSequenceNumberUri);
 }
 
 // Test support for video rotation header extension.
 TEST_F(WebRtcVideoChannel2Test, SendVideoRotationHeaderExtensions) {
-  TestSetSendRtpHeaderExtensions(kRtpVideoRotationHeaderExtension,
-                                 webrtc::RtpExtension::kVideoRotation);
+  TestSetSendRtpHeaderExtensions(RtpExtension::kVideoRotationUri);
 }
 TEST_F(WebRtcVideoChannel2Test, RecvVideoRotationHeaderExtensions) {
-  TestSetRecvRtpHeaderExtensions(kRtpVideoRotationHeaderExtension,
-                                 webrtc::RtpExtension::kVideoRotation);
+  TestSetRecvRtpHeaderExtensions(RtpExtension::kVideoRotationUri);
 }
 
 TEST_F(WebRtcVideoChannel2Test, IdenticalSendExtensionsDoesntRecreateStream) {
   const int kAbsSendTimeId = 1;
   const int kVideoRotationId = 2;
-  send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
-      kRtpAbsoluteSenderTimeHeaderExtension, kAbsSendTimeId));
-  send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
-      kRtpVideoRotationHeaderExtension, kVideoRotationId));
+  send_parameters_.extensions.push_back(
+      RtpExtension(RtpExtension::kAbsSendTimeUri, kAbsSendTimeId));
+  send_parameters_.extensions.push_back(
+      RtpExtension(RtpExtension::kVideoRotationUri, kVideoRotationId));
 
   EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
   FakeVideoSendStream* send_stream =
@@ -1319,12 +1307,12 @@
   const int kTOffsetId = 1;
   const int kAbsSendTimeId = 2;
   const int kVideoRotationId = 3;
-  recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
-      kRtpAbsoluteSenderTimeHeaderExtension, kAbsSendTimeId));
-  recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
-      kRtpTimestampOffsetHeaderExtension, kTOffsetId));
-  recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
-      kRtpVideoRotationHeaderExtension, kVideoRotationId));
+  recv_parameters_.extensions.push_back(
+      RtpExtension(RtpExtension::kAbsSendTimeUri, kAbsSendTimeId));
+  recv_parameters_.extensions.push_back(
+      RtpExtension(RtpExtension::kTimestampOffsetUri, kTOffsetId));
+  recv_parameters_.extensions.push_back(
+      RtpExtension(RtpExtension::kVideoRotationUri, kVideoRotationId));
 
   EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
   FakeVideoReceiveStream* recv_stream =
@@ -1354,9 +1342,9 @@
   const int kTOffsetId = 2;
 
   send_parameters_.extensions.push_back(
-      cricket::RtpHeaderExtension(kUnsupportedExtensionName, kUnsupportedId));
+      RtpExtension(kUnsupportedExtensionName, kUnsupportedId));
   send_parameters_.extensions.push_back(
-      cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, kTOffsetId));
+      RtpExtension(RtpExtension::kTimestampOffsetUri, kTOffsetId));
   EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
   FakeVideoSendStream* send_stream =
       AddSendStream(cricket::StreamParams::CreateLegacy(123));
@@ -1364,8 +1352,8 @@
   // Only timestamp offset extension is set to send stream,
   // unsupported rtp extension is ignored.
   ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
-  EXPECT_STREQ(webrtc::RtpExtension::kTOffset,
-               send_stream->GetConfig().rtp.extensions[0].name.c_str());
+  EXPECT_STREQ(RtpExtension::kTimestampOffsetUri,
+               send_stream->GetConfig().rtp.extensions[0].uri.c_str());
 }
 
 TEST_F(WebRtcVideoChannel2Test,
@@ -1374,9 +1362,9 @@
   const int kTOffsetId = 2;
 
   recv_parameters_.extensions.push_back(
-      cricket::RtpHeaderExtension(kUnsupportedExtensionName, kUnsupportedId));
+      RtpExtension(kUnsupportedExtensionName, kUnsupportedId));
   recv_parameters_.extensions.push_back(
-      cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, kTOffsetId));
+      RtpExtension(RtpExtension::kTimestampOffsetUri, kTOffsetId));
   EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
   FakeVideoReceiveStream* recv_stream =
       AddRecvStream(cricket::StreamParams::CreateLegacy(123));
@@ -1384,15 +1372,15 @@
   // Only timestamp offset extension is set to receive stream,
   // unsupported rtp extension is ignored.
   ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
-  EXPECT_STREQ(webrtc::RtpExtension::kTOffset,
-               recv_stream->GetConfig().rtp.extensions[0].name.c_str());
+  EXPECT_STREQ(RtpExtension::kTimestampOffsetUri,
+               recv_stream->GetConfig().rtp.extensions[0].uri.c_str());
 }
 
 TEST_F(WebRtcVideoChannel2Test, SetSendRtpHeaderExtensionsRejectsIncorrectIds) {
   const int kIncorrectIds[] = {-2, -1, 0, 15, 16};
   for (size_t i = 0; i < arraysize(kIncorrectIds); ++i) {
-    send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
-        webrtc::RtpExtension::kTOffset, kIncorrectIds[i]));
+    send_parameters_.extensions.push_back(
+        RtpExtension(RtpExtension::kTimestampOffsetUri, kIncorrectIds[i]));
     EXPECT_FALSE(channel_->SetSendParameters(send_parameters_))
         << "Bad extension id '" << kIncorrectIds[i] << "' accepted.";
   }
@@ -1401,8 +1389,8 @@
 TEST_F(WebRtcVideoChannel2Test, SetRecvRtpHeaderExtensionsRejectsIncorrectIds) {
   const int kIncorrectIds[] = {-2, -1, 0, 15, 16};
   for (size_t i = 0; i < arraysize(kIncorrectIds); ++i) {
-    recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
-        webrtc::RtpExtension::kTOffset, kIncorrectIds[i]));
+    recv_parameters_.extensions.push_back(
+        RtpExtension(RtpExtension::kTimestampOffsetUri, kIncorrectIds[i]));
     EXPECT_FALSE(channel_->SetRecvParameters(recv_parameters_))
         << "Bad extension id '" << kIncorrectIds[i] << "' accepted.";
   }
@@ -1411,15 +1399,15 @@
 TEST_F(WebRtcVideoChannel2Test, SetSendRtpHeaderExtensionsRejectsDuplicateIds) {
   const int id = 1;
   send_parameters_.extensions.push_back(
-      cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
+      RtpExtension(RtpExtension::kTimestampOffsetUri, id));
   send_parameters_.extensions.push_back(
-      cricket::RtpHeaderExtension(kRtpAbsoluteSenderTimeHeaderExtension, id));
+      RtpExtension(RtpExtension::kAbsSendTimeUri, id));
   EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
 
   // Duplicate entries are also not supported.
   send_parameters_.extensions.clear();
   send_parameters_.extensions.push_back(
-      cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
+      RtpExtension(RtpExtension::kTimestampOffsetUri, id));
   send_parameters_.extensions.push_back(send_parameters_.extensions.back());
   EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
 }
@@ -1427,15 +1415,15 @@
 TEST_F(WebRtcVideoChannel2Test, SetRecvRtpHeaderExtensionsRejectsDuplicateIds) {
   const int id = 1;
   recv_parameters_.extensions.push_back(
-      cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
+      RtpExtension(RtpExtension::kTimestampOffsetUri, id));
   recv_parameters_.extensions.push_back(
-      cricket::RtpHeaderExtension(kRtpAbsoluteSenderTimeHeaderExtension, id));
+      RtpExtension(RtpExtension::kAbsSendTimeUri, id));
   EXPECT_FALSE(channel_->SetRecvParameters(recv_parameters_));
 
   // Duplicate entries are also not supported.
   recv_parameters_.extensions.clear();
   recv_parameters_.extensions.push_back(
-      cricket::RtpHeaderExtension(webrtc::RtpExtension::kTOffset, id));
+      RtpExtension(RtpExtension::kTimestampOffsetUri, id));
   recv_parameters_.extensions.push_back(recv_parameters_.extensions.back());
   EXPECT_FALSE(channel_->SetRecvParameters(recv_parameters_));
 }
diff --git a/webrtc/media/engine/webrtcvoiceengine.cc b/webrtc/media/engine/webrtcvoiceengine.cc
index 09a072a..95b08e7 100644
--- a/webrtc/media/engine/webrtcvoiceengine.cc
+++ b/webrtc/media/engine/webrtcvoiceengine.cc
@@ -951,16 +951,17 @@
 RtpCapabilities WebRtcVoiceEngine::GetCapabilities() const {
   RTC_DCHECK(signal_thread_checker_.CalledOnValidThread());
   RtpCapabilities capabilities;
-  capabilities.header_extensions.push_back(RtpHeaderExtension(
-      kRtpAudioLevelHeaderExtension, kRtpAudioLevelHeaderExtensionDefaultId));
   capabilities.header_extensions.push_back(
-      RtpHeaderExtension(kRtpAbsoluteSenderTimeHeaderExtension,
-                         kRtpAbsoluteSenderTimeHeaderExtensionDefaultId));
+      webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri,
+                           webrtc::RtpExtension::kAudioLevelDefaultId));
+  capabilities.header_extensions.push_back(
+      webrtc::RtpExtension(webrtc::RtpExtension::kAbsSendTimeUri,
+                           webrtc::RtpExtension::kAbsSendTimeDefaultId));
   if (webrtc::field_trial::FindFullName("WebRTC-Audio-SendSideBwe") ==
       "Enabled") {
-    capabilities.header_extensions.push_back(RtpHeaderExtension(
-        kRtpTransportSequenceNumberHeaderExtension,
-        kRtpTransportSequenceNumberHeaderExtensionDefaultId));
+    capabilities.header_extensions.push_back(webrtc::RtpExtension(
+        webrtc::RtpExtension::kTransportSequenceNumberUri,
+        webrtc::RtpExtension::kTransportSequenceNumberDefaultId));
   }
   return capabilities;
 }
diff --git a/webrtc/media/engine/webrtcvoiceengine_unittest.cc b/webrtc/media/engine/webrtcvoiceengine_unittest.cc
index 4446e27..337f1d5 100644
--- a/webrtc/media/engine/webrtcvoiceengine_unittest.cc
+++ b/webrtc/media/engine/webrtcvoiceengine_unittest.cc
@@ -26,8 +26,6 @@
 #include "webrtc/media/engine/webrtcvoiceengine.h"
 #include "webrtc/modules/audio_device/include/mock_audio_device.h"
 
-using cricket::kRtpAudioLevelHeaderExtension;
-using cricket::kRtpAbsoluteSenderTimeHeaderExtension;
 using testing::Return;
 using testing::StrictMock;
 
@@ -289,8 +287,8 @@
     EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
 
     // Ensure unknown extensions won't cause an error.
-    send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
-        "urn:ietf:params:unknownextention", 1));
+    send_parameters_.extensions.push_back(
+        webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
     EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
     EXPECT_EQ(0u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
 
@@ -301,10 +299,10 @@
 
     // Ensure extension is set properly.
     const int id = 1;
-    send_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
+    send_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
     EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
     EXPECT_EQ(1u, GetSendStreamConfig(kSsrc1).rtp.extensions.size());
-    EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].name);
+    EXPECT_EQ(ext, GetSendStreamConfig(kSsrc1).rtp.extensions[0].uri);
     EXPECT_EQ(id, GetSendStreamConfig(kSsrc1).rtp.extensions[0].id);
 
     // Ensure extension is set properly on new stream.
@@ -313,7 +311,7 @@
     EXPECT_NE(call_.GetAudioSendStream(kSsrc1),
               call_.GetAudioSendStream(kSsrc2));
     EXPECT_EQ(1u, GetSendStreamConfig(kSsrc2).rtp.extensions.size());
-    EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].name);
+    EXPECT_EQ(ext, GetSendStreamConfig(kSsrc2).rtp.extensions[0].uri);
     EXPECT_EQ(id, GetSendStreamConfig(kSsrc2).rtp.extensions[0].id);
 
     // Ensure all extensions go back off with an empty list.
@@ -331,8 +329,8 @@
     EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
 
     // Ensure unknown extensions won't cause an error.
-    recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(
-        "urn:ietf:params:unknownextention", 1));
+    recv_parameters_.extensions.push_back(
+        webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
     EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
     EXPECT_EQ(0u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
 
@@ -343,10 +341,10 @@
 
     // Ensure extension is set properly.
     const int id = 2;
-    recv_parameters_.extensions.push_back(cricket::RtpHeaderExtension(ext, id));
+    recv_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
     EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
     EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc1).rtp.extensions.size());
-    EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].name);
+    EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].uri);
     EXPECT_EQ(id, GetRecvStreamConfig(kSsrc1).rtp.extensions[0].id);
 
     // Ensure extension is set properly on new stream.
@@ -355,7 +353,7 @@
     EXPECT_NE(call_.GetAudioReceiveStream(kSsrc1),
               call_.GetAudioReceiveStream(kSsrc2));
     EXPECT_EQ(1u, GetRecvStreamConfig(kSsrc2).rtp.extensions.size());
-    EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].name);
+    EXPECT_EQ(ext, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].uri);
     EXPECT_EQ(id, GetRecvStreamConfig(kSsrc2).rtp.extensions[0].id);
 
     // Ensure all extensions go back off with an empty list.
@@ -2253,10 +2251,9 @@
        SupportsTransportSequenceNumberHeaderExtension) {
   cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
   ASSERT_FALSE(capabilities.header_extensions.empty());
-  for (const cricket::RtpHeaderExtension& extension :
-       capabilities.header_extensions) {
-    if (extension.uri == cricket::kRtpTransportSequenceNumberHeaderExtension) {
-      EXPECT_EQ(cricket::kRtpTransportSequenceNumberHeaderExtensionDefaultId,
+  for (const webrtc::RtpExtension& extension : capabilities.header_extensions) {
+    if (extension.uri == webrtc::RtpExtension::kTransportSequenceNumberUri) {
+      EXPECT_EQ(webrtc::RtpExtension::kTransportSequenceNumberDefaultId,
                 extension.id);
       return;
     }
@@ -2266,18 +2263,18 @@
 
 // Test support for audio level header extension.
 TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
-  TestSetSendRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
+  TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
 }
 TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
-  TestSetRecvRtpHeaderExtensions(kRtpAudioLevelHeaderExtension);
+  TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
 }
 
 // Test support for absolute send time header extension.
 TEST_F(WebRtcVoiceEngineTestFake, SendAbsoluteSendTimeHeaderExtensions) {
-  TestSetSendRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
+  TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
 }
 TEST_F(WebRtcVoiceEngineTestFake, RecvAbsoluteSendTimeHeaderExtensions) {
-  TestSetRecvRtpHeaderExtensions(kRtpAbsoluteSenderTimeHeaderExtension);
+  TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAbsSendTimeUri);
 }
 
 // Test that we can create a channel and start sending on it.
@@ -2315,7 +2312,7 @@
 
   // Changing RTP header extensions will recreate the AudioSendStream.
   send_parameters_.extensions.push_back(
-      cricket::RtpHeaderExtension(kRtpAudioLevelHeaderExtension, 12));
+      webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
   EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
   EXPECT_TRUE(GetSendStream(kSsrc1).IsSending());
 
@@ -3383,7 +3380,7 @@
     for (const auto& e_ext : capabilities.header_extensions) {
       for (const auto& s_ext : s_exts) {
         if (e_ext.id == s_ext.id) {
-          EXPECT_EQ(e_ext.uri, s_ext.name);
+          EXPECT_EQ(e_ext.uri, s_ext.uri);
         }
       }
     }
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc b/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
index 214472f..2a9220d 100644
--- a/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
+++ b/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
@@ -29,15 +29,15 @@
 namespace webrtc {
 
 RTPExtensionType StringToRtpExtensionType(const std::string& extension) {
-  if (extension == RtpExtension::kTOffset)
+  if (extension == RtpExtension::kTimestampOffsetUri)
     return kRtpExtensionTransmissionTimeOffset;
-  if (extension == RtpExtension::kAudioLevel)
+  if (extension == RtpExtension::kAudioLevelUri)
     return kRtpExtensionAudioLevel;
-  if (extension == RtpExtension::kAbsSendTime)
+  if (extension == RtpExtension::kAbsSendTimeUri)
     return kRtpExtensionAbsoluteSendTime;
-  if (extension == RtpExtension::kVideoRotation)
+  if (extension == RtpExtension::kVideoRotationUri)
     return kRtpExtensionVideoRotation;
-  if (extension == RtpExtension::kTransportSequenceNumber)
+  if (extension == RtpExtension::kTransportSequenceNumberUri)
     return kRtpExtensionTransportSequenceNumber;
   RTC_NOTREACHED() << "Looking up unsupported RTP extension.";
   return kRtpExtensionNone;
diff --git a/webrtc/pc/channel.cc b/webrtc/pc/channel.cc
index 97c1d66..cac0ea2 100644
--- a/webrtc/pc/channel.cc
+++ b/webrtc/pc/channel.cc
@@ -43,6 +43,20 @@
   rtc::PacketOptions options;
 };
 
+#if defined(ENABLE_EXTERNAL_AUTH)
+// Returns the named header extension if found among all extensions,
+// nullptr otherwise.
+const webrtc::RtpExtension* FindHeaderExtension(
+    const std::vector<webrtc::RtpExtension>& extensions,
+    const std::string& uri) {
+  for (const auto& extension : extensions) {
+    if (extension.uri == uri)
+      return &extension;
+  }
+  return nullptr;
+}
+#endif
+
 }  // namespace
 
 enum {
@@ -1390,13 +1404,13 @@
 }
 
 void BaseChannel::MaybeCacheRtpAbsSendTimeHeaderExtension_w(
-    const std::vector<RtpHeaderExtension>& extensions) {
+    const std::vector<webrtc::RtpExtension>& extensions) {
 // Absolute Send Time extension id is used only with external auth,
 // so do not bother searching for it and making asyncronious call to set
 // something that is not used.
 #if defined(ENABLE_EXTERNAL_AUTH)
-  const RtpHeaderExtension* send_time_extension =
-      FindHeaderExtension(extensions, kRtpAbsoluteSenderTimeHeaderExtension);
+  const webrtc::RtpExtension* send_time_extension =
+      FindHeaderExtension(extensions, webrtc::RtpExtension::kAbsSendTimeUri);
   int rtp_abs_sendtime_extn_id =
       send_time_extension ? send_time_extension->id : -1;
   invoker_.AsyncInvoke<void>(
diff --git a/webrtc/pc/channel.h b/webrtc/pc/channel.h
index d9f5fd6..3305d0e 100644
--- a/webrtc/pc/channel.h
+++ b/webrtc/pc/channel.h
@@ -282,7 +282,7 @@
   // Helper method to get RTP Absoulute SendTime extension header id if
   // present in remote supported extensions list.
   void MaybeCacheRtpAbsSendTimeHeaderExtension_w(
-      const std::vector<RtpHeaderExtension>& extensions);
+      const std::vector<webrtc::RtpExtension>& extensions);
 
   bool CheckSrtpConfig_n(const std::vector<CryptoParams>& cryptos,
                          bool* dtls,
diff --git a/webrtc/pc/mediasession.cc b/webrtc/pc/mediasession.cc
index 0fa20d8..358f92d 100644
--- a/webrtc/pc/mediasession.cc
+++ b/webrtc/pc/mediasession.cc
@@ -374,11 +374,10 @@
 
 // Helper class used for finding duplicate RTP Header extension ids among
 // audio and video extensions.
-class UsedRtpHeaderExtensionIds : public UsedIds<RtpHeaderExtension> {
+class UsedRtpHeaderExtensionIds : public UsedIds<webrtc::RtpExtension> {
  public:
   UsedRtpHeaderExtensionIds()
-      : UsedIds<RtpHeaderExtension>(kLocalIdMin, kLocalIdMax) {
-  }
+      : UsedIds<webrtc::RtpExtension>(kLocalIdMin, kLocalIdMax) {}
 
  private:
   // Min and Max local identifier for one-byte header extensions, per RFC5285.
@@ -890,10 +889,9 @@
   }
 }
 
-
 static bool FindByUri(const RtpHeaderExtensions& extensions,
-                      const RtpHeaderExtension& ext_to_match,
-                      RtpHeaderExtension* found_extension) {
+                      const webrtc::RtpExtension& ext_to_match,
+                      webrtc::RtpExtension* found_extension) {
   for (RtpHeaderExtensions::const_iterator it = extensions.begin();
        it  != extensions.end(); ++it) {
     // We assume that all URIs are given in a canonical format.
@@ -915,7 +913,7 @@
                                     RtpHeaderExtensions* all_extensions,
                                     UsedRtpHeaderExtensionIds* used_ids) {
   for (auto& extension : *offered_extensions) {
-    RtpHeaderExtension existing;
+    webrtc::RtpExtension existing;
     if (FindByUri(*all_extensions, extension, &existing)) {
       extension.id = existing.id;
     } else {
@@ -934,7 +932,7 @@
     UsedRtpHeaderExtensionIds* used_ids) {
   for (auto reference_extension : reference_extensions) {
     if (!FindByUri(*offered_extensions, reference_extension, NULL)) {
-      RtpHeaderExtension existing;
+      webrtc::RtpExtension existing;
       if (FindByUri(*all_extensions, reference_extension, &existing)) {
         offered_extensions->push_back(existing);
       } else {
@@ -953,7 +951,7 @@
   RtpHeaderExtensions::const_iterator ours;
   for (ours = local_extensions.begin();
        ours != local_extensions.end(); ++ours) {
-    RtpHeaderExtension theirs;
+    webrtc::RtpExtension theirs;
     if (FindByUri(offered_extensions, *ours, &theirs)) {
       // We respond with their RTP header extension id.
       negotiated_extenstions->push_back(theirs);
diff --git a/webrtc/pc/mediasession.h b/webrtc/pc/mediasession.h
index 22291c4..0a04bcf 100644
--- a/webrtc/pc/mediasession.h
+++ b/webrtc/pc/mediasession.h
@@ -35,7 +35,7 @@
 typedef std::vector<VideoCodec> VideoCodecs;
 typedef std::vector<DataCodec> DataCodecs;
 typedef std::vector<CryptoParams> CryptoParamsVec;
-typedef std::vector<RtpHeaderExtension> RtpHeaderExtensions;
+typedef std::vector<webrtc::RtpExtension> RtpHeaderExtensions;
 
 enum MediaType {
   MEDIA_TYPE_AUDIO,
@@ -205,7 +205,7 @@
     rtp_header_extensions_ = extensions;
     rtp_header_extensions_set_ = true;
   }
-  void AddRtpHeaderExtension(const RtpHeaderExtension& ext) {
+  void AddRtpHeaderExtension(const webrtc::RtpExtension& ext) {
     rtp_header_extensions_.push_back(ext);
     rtp_header_extensions_set_ = true;
   }
@@ -284,7 +284,7 @@
   std::string protocol_;
   std::vector<CryptoParams> cryptos_;
   CryptoType crypto_required_ = CT_NONE;
-  std::vector<RtpHeaderExtension> rtp_header_extensions_;
+  std::vector<webrtc::RtpExtension> rtp_header_extensions_;
   bool rtp_header_extensions_set_ = false;
   bool multistream_ = false;
   StreamParamsVec streams_;
diff --git a/webrtc/pc/mediasession_unittest.cc b/webrtc/pc/mediasession_unittest.cc
index b14bd80..753db83 100644
--- a/webrtc/pc/mediasession_unittest.cc
+++ b/webrtc/pc/mediasession_unittest.cc
@@ -67,12 +67,12 @@
 using cricket::MEDIA_TYPE_AUDIO;
 using cricket::MEDIA_TYPE_VIDEO;
 using cricket::MEDIA_TYPE_DATA;
-using cricket::RtpHeaderExtension;
 using cricket::SEC_DISABLED;
 using cricket::SEC_ENABLED;
 using cricket::SEC_REQUIRED;
 using rtc::CS_AES_CM_128_HMAC_SHA1_32;
 using rtc::CS_AES_CM_128_HMAC_SHA1_80;
+using webrtc::RtpExtension;
 
 static const AudioCodec kAudioCodecs1[] = {
     AudioCodec(103, "ISAC", 16000, -1, 1),
@@ -113,44 +113,44 @@
 static const DataCodec kDataCodecsAnswer[] = {DataCodec(98, "binary-data"),
                                               DataCodec(99, "utf8-text")};
 
-static const RtpHeaderExtension kAudioRtpExtension1[] = {
-  RtpHeaderExtension("urn:ietf:params:rtp-hdrext:ssrc-audio-level", 8),
-  RtpHeaderExtension("http://google.com/testing/audio_something", 10),
+static const RtpExtension kAudioRtpExtension1[] = {
+    RtpExtension("urn:ietf:params:rtp-hdrext:ssrc-audio-level", 8),
+    RtpExtension("http://google.com/testing/audio_something", 10),
 };
 
-static const RtpHeaderExtension kAudioRtpExtension2[] = {
-  RtpHeaderExtension("urn:ietf:params:rtp-hdrext:ssrc-audio-level", 2),
-  RtpHeaderExtension("http://google.com/testing/audio_something_else", 8),
-  RtpHeaderExtension("http://google.com/testing/both_audio_and_video", 7),
+static const RtpExtension kAudioRtpExtension2[] = {
+    RtpExtension("urn:ietf:params:rtp-hdrext:ssrc-audio-level", 2),
+    RtpExtension("http://google.com/testing/audio_something_else", 8),
+    RtpExtension("http://google.com/testing/both_audio_and_video", 7),
 };
 
-static const RtpHeaderExtension kAudioRtpExtension3[] = {
-  RtpHeaderExtension("http://google.com/testing/audio_something", 2),
-  RtpHeaderExtension("http://google.com/testing/both_audio_and_video", 3),
+static const RtpExtension kAudioRtpExtension3[] = {
+    RtpExtension("http://google.com/testing/audio_something", 2),
+    RtpExtension("http://google.com/testing/both_audio_and_video", 3),
 };
 
-static const RtpHeaderExtension kAudioRtpExtensionAnswer[] = {
-  RtpHeaderExtension("urn:ietf:params:rtp-hdrext:ssrc-audio-level", 8),
+static const RtpExtension kAudioRtpExtensionAnswer[] = {
+    RtpExtension("urn:ietf:params:rtp-hdrext:ssrc-audio-level", 8),
 };
 
-static const RtpHeaderExtension kVideoRtpExtension1[] = {
-  RtpHeaderExtension("urn:ietf:params:rtp-hdrext:toffset", 14),
-  RtpHeaderExtension("http://google.com/testing/video_something", 13),
+static const RtpExtension kVideoRtpExtension1[] = {
+    RtpExtension("urn:ietf:params:rtp-hdrext:toffset", 14),
+    RtpExtension("http://google.com/testing/video_something", 13),
 };
 
-static const RtpHeaderExtension kVideoRtpExtension2[] = {
-  RtpHeaderExtension("urn:ietf:params:rtp-hdrext:toffset", 2),
-  RtpHeaderExtension("http://google.com/testing/video_something_else", 14),
-  RtpHeaderExtension("http://google.com/testing/both_audio_and_video", 7),
+static const RtpExtension kVideoRtpExtension2[] = {
+    RtpExtension("urn:ietf:params:rtp-hdrext:toffset", 2),
+    RtpExtension("http://google.com/testing/video_something_else", 14),
+    RtpExtension("http://google.com/testing/both_audio_and_video", 7),
 };
 
-static const RtpHeaderExtension kVideoRtpExtension3[] = {
-  RtpHeaderExtension("http://google.com/testing/video_something", 4),
-  RtpHeaderExtension("http://google.com/testing/both_audio_and_video", 5),
+static const RtpExtension kVideoRtpExtension3[] = {
+    RtpExtension("http://google.com/testing/video_something", 4),
+    RtpExtension("http://google.com/testing/both_audio_and_video", 5),
 };
 
-static const RtpHeaderExtension kVideoRtpExtensionAnswer[] = {
-  RtpHeaderExtension("urn:ietf:params:rtp-hdrext:toffset", 14),
+static const RtpExtension kVideoRtpExtensionAnswer[] = {
+    RtpExtension("urn:ietf:params:rtp-hdrext:toffset", 14),
 };
 
 static const uint32_t kSimulcastParamsSsrc[] = {10, 11, 20, 21, 30, 31};
@@ -1904,18 +1904,16 @@
   // |f2_| offer.
   // Since the default local extension id |f2_| uses has already been used by
   // |f1_| for another extensions, it is changed to 13.
-  const RtpHeaderExtension kUpdatedAudioRtpExtensions[] = {
-    kAudioRtpExtensionAnswer[0],
-    RtpHeaderExtension(kAudioRtpExtension2[1].uri, 13),
-    kAudioRtpExtension2[2],
+  const RtpExtension kUpdatedAudioRtpExtensions[] = {
+      kAudioRtpExtensionAnswer[0], RtpExtension(kAudioRtpExtension2[1].uri, 13),
+      kAudioRtpExtension2[2],
   };
 
   // Since the default local extension id |f2_| uses has already been used by
   // |f1_| for another extensions, is is changed to 12.
-  const RtpHeaderExtension kUpdatedVideoRtpExtensions[] = {
-    kVideoRtpExtensionAnswer[0],
-    RtpHeaderExtension(kVideoRtpExtension2[1].uri, 12),
-    kVideoRtpExtension2[2],
+  const RtpExtension kUpdatedVideoRtpExtensions[] = {
+      kVideoRtpExtensionAnswer[0], RtpExtension(kVideoRtpExtension2[1].uri, 12),
+      kVideoRtpExtension2[2],
   };
 
   const AudioContentDescription* updated_acd =
@@ -1932,8 +1930,7 @@
 // Verify that if the same RTP extension URI is used for audio and video, the
 // same ID is used. Also verify that the ID isn't changed when creating an
 // updated offer (this was previously a bug).
-TEST_F(MediaSessionDescriptionFactoryTest,
-       RtpHeaderExtensionIdReused) {
+TEST_F(MediaSessionDescriptionFactoryTest, RtpExtensionIdReused) {
   MediaSessionOptions opts;
   opts.recv_audio = true;
   opts.recv_video = true;
@@ -1945,9 +1942,8 @@
 
   // Since the audio extensions used ID 3 for "both_audio_and_video", so should
   // the video extensions.
-  const RtpHeaderExtension kExpectedVideoRtpExtension[] = {
-    kVideoRtpExtension3[0],
-    kAudioRtpExtension3[1],
+  const RtpExtension kExpectedVideoRtpExtension[] = {
+      kVideoRtpExtension3[0], kAudioRtpExtension3[1],
   };
 
   EXPECT_EQ(MAKE_VECTOR(kAudioRtpExtension3),
diff --git a/webrtc/test/call_test.cc b/webrtc/test/call_test.cc
index 768c007..8da747a 100644
--- a/webrtc/test/call_test.cc
+++ b/webrtc/test/call_test.cc
@@ -184,12 +184,12 @@
     video_send_config_.encoder_settings.payload_type =
         kFakeVideoSendPayloadType;
     video_send_config_.rtp.extensions.push_back(
-        RtpExtension(RtpExtension::kAbsSendTime, kAbsSendTimeExtensionId));
+        RtpExtension(RtpExtension::kAbsSendTimeUri, kAbsSendTimeExtensionId));
     video_encoder_config_.streams = test::CreateVideoStreams(num_video_streams);
     for (size_t i = 0; i < num_video_streams; ++i)
       video_send_config_.rtp.ssrcs.push_back(kVideoSendSsrcs[i]);
     video_send_config_.rtp.extensions.push_back(RtpExtension(
-        RtpExtension::kVideoRotation, kVideoRotationRtpExtensionId));
+        RtpExtension::kVideoRotationUri, kVideoRotationRtpExtensionId));
   }
 
   if (num_audio_streams > 0) {
diff --git a/webrtc/video/end_to_end_tests.cc b/webrtc/video/end_to_end_tests.cc
index 607d654..f785199b 100644
--- a/webrtc/video/end_to_end_tests.cc
+++ b/webrtc/video/end_to_end_tests.cc
@@ -1432,8 +1432,8 @@
         VideoEncoderConfig* encoder_config,
         test::FrameGeneratorCapturer** frame_generator) override {
       send_config->rtp.extensions.clear();
-      send_config->rtp.extensions.push_back(
-          RtpExtension(RtpExtension::kTransportSequenceNumber, kExtensionId));
+      send_config->rtp.extensions.push_back(RtpExtension(
+          RtpExtension::kTransportSequenceNumberUri, kExtensionId));
 
       // Force some padding to be sent.
       const int kPaddingBitrateBps = 50000;
@@ -1459,8 +1459,8 @@
         VideoReceiveStream::Config* receive_config) override {
       receive_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
       receive_config->rtp.extensions.clear();
-      receive_config->rtp.extensions.push_back(
-          RtpExtension(RtpExtension::kTransportSequenceNumber, kExtensionId));
+      receive_config->rtp.extensions.push_back(RtpExtension(
+          RtpExtension::kTransportSequenceNumberUri, kExtensionId));
     }
 
     test::DirectTransport* CreateSendTransport(Call* sender_call) override {
@@ -1539,7 +1539,7 @@
       VideoEncoderConfig* encoder_config) override {
     send_config->rtp.extensions.clear();
     send_config->rtp.extensions.push_back(
-        RtpExtension(RtpExtension::kTransportSequenceNumber, kExtensionId));
+        RtpExtension(RtpExtension::kTransportSequenceNumberUri, kExtensionId));
     (*receive_configs)[0].rtp.extensions = send_config->rtp.extensions;
     (*receive_configs)[0].rtp.transport_cc = feedback_enabled_;
   }
@@ -1549,7 +1549,7 @@
       std::vector<AudioReceiveStream::Config>* receive_configs) override {
     send_config->rtp.extensions.clear();
     send_config->rtp.extensions.push_back(
-        RtpExtension(RtpExtension::kTransportSequenceNumber, kExtensionId));
+        RtpExtension(RtpExtension::kTransportSequenceNumberUri, kExtensionId));
     (*receive_configs)[0].rtp.extensions.clear();
     (*receive_configs)[0].rtp.extensions = send_config->rtp.extensions;
     (*receive_configs)[0].rtp.transport_cc = feedback_enabled_;
@@ -1787,7 +1787,7 @@
       ASSERT_EQ(1u, send_config->rtp.ssrcs.size());
       send_config->rtp.extensions.clear();
       send_config->rtp.extensions.push_back(
-          RtpExtension(RtpExtension::kTransportSequenceNumber,
+          RtpExtension(RtpExtension::kTransportSequenceNumberUri,
                        test::kTransportSequenceNumberExtensionId));
       sender_ssrc_ = send_config->rtp.ssrcs[0];
 
@@ -3452,8 +3452,8 @@
         std::vector<VideoReceiveStream::Config>* receive_configs,
         VideoEncoderConfig* encoder_config) override {
       send_config->rtp.extensions.clear();
-      send_config->rtp.extensions.push_back(
-          RtpExtension(RtpExtension::kTransportSequenceNumber, kExtensionId));
+      send_config->rtp.extensions.push_back(RtpExtension(
+          RtpExtension::kTransportSequenceNumberUri, kExtensionId));
       (*receive_configs)[0].rtp.extensions = send_config->rtp.extensions;
     }
 
@@ -3461,8 +3461,8 @@
         AudioSendStream::Config* send_config,
         std::vector<AudioReceiveStream::Config>* receive_configs) override {
       send_config->rtp.extensions.clear();
-      send_config->rtp.extensions.push_back(
-          RtpExtension(RtpExtension::kTransportSequenceNumber, kExtensionId));
+      send_config->rtp.extensions.push_back(RtpExtension(
+          RtpExtension::kTransportSequenceNumberUri, kExtensionId));
       (*receive_configs)[0].rtp.extensions.clear();
       (*receive_configs)[0].rtp.extensions = send_config->rtp.extensions;
     }
diff --git a/webrtc/video/replay.cc b/webrtc/video/replay.cc
index 1dfc610..d9a1c1a 100644
--- a/webrtc/video/replay.cc
+++ b/webrtc/video/replay.cc
@@ -222,12 +222,12 @@
   receive_config.rtp.fec.red_payload_type = flags::RedPayloadType();
   receive_config.rtp.nack.rtp_history_ms = 1000;
   if (flags::TransmissionOffsetId() != -1) {
-    receive_config.rtp.extensions.push_back(
-        RtpExtension(RtpExtension::kTOffset, flags::TransmissionOffsetId()));
+    receive_config.rtp.extensions.push_back(RtpExtension(
+        RtpExtension::kTimestampOffsetUri, flags::TransmissionOffsetId()));
   }
   if (flags::AbsSendTimeId() != -1) {
     receive_config.rtp.extensions.push_back(
-        RtpExtension(RtpExtension::kAbsSendTime, flags::AbsSendTimeId()));
+        RtpExtension(RtpExtension::kAbsSendTimeUri, flags::AbsSendTimeId()));
   }
   receive_config.renderer = &file_passthrough;
 
diff --git a/webrtc/video/rtp_stream_receiver.cc b/webrtc/video/rtp_stream_receiver.cc
index 98b4683..188cf74 100644
--- a/webrtc/video/rtp_stream_receiver.cc
+++ b/webrtc/video/rtp_stream_receiver.cc
@@ -127,7 +127,7 @@
   }
 
   for (size_t i = 0; i < config.rtp.extensions.size(); ++i) {
-    EnableReceiveRtpHeaderExtension(config.rtp.extensions[i].name,
+    EnableReceiveRtpHeaderExtension(config.rtp.extensions[i].uri,
                                     config.rtp.extensions[i].id);
   }
 
diff --git a/webrtc/video/video_quality_test.cc b/webrtc/video/video_quality_test.cc
index 87ed269..94a446e 100644
--- a/webrtc/video/video_quality_test.cc
+++ b/webrtc/video/video_quality_test.cc
@@ -884,11 +884,11 @@
   video_send_config_.rtp.extensions.clear();
   if (params_.common.send_side_bwe) {
     video_send_config_.rtp.extensions.push_back(
-        RtpExtension(RtpExtension::kTransportSequenceNumber,
+        RtpExtension(RtpExtension::kTransportSequenceNumberUri,
                      test::kTransportSequenceNumberExtensionId));
   } else {
     video_send_config_.rtp.extensions.push_back(RtpExtension(
-        RtpExtension::kAbsSendTime, test::kAbsSendTimeExtensionId));
+        RtpExtension::kAbsSendTimeUri, test::kAbsSendTimeExtensionId));
   }
 
   video_encoder_config_.min_transmit_bitrate_bps =
diff --git a/webrtc/video/video_receive_stream.cc b/webrtc/video/video_receive_stream.cc
index 1753db5..cee820a 100644
--- a/webrtc/video/video_receive_stream.cc
+++ b/webrtc/video/video_receive_stream.cc
@@ -35,7 +35,7 @@
   if (!config.rtp.transport_cc)
     return false;
   for (const auto& extension : config.rtp.extensions) {
-    if (extension.name == RtpExtension::kTransportSequenceNumber)
+    if (extension.uri == RtpExtension::kTransportSequenceNumberUri)
       return true;
   }
   return false;
diff --git a/webrtc/video/video_send_stream.cc b/webrtc/video/video_send_stream.cc
index e42b923..afd9909 100644
--- a/webrtc/video/video_send_stream.cc
+++ b/webrtc/video/video_send_stream.cc
@@ -425,7 +425,7 @@
   video_sender_->RegisterProtectionCallback(this);
 
   for (size_t i = 0; i < config_.rtp.extensions.size(); ++i) {
-    const std::string& extension = config_.rtp.extensions[i].name;
+    const std::string& extension = config_.rtp.extensions[i].uri;
     int id = config_.rtp.extensions[i].id;
     // One-byte-extension local identifiers are in the range 1-14 inclusive.
     RTC_DCHECK_GE(id, 1);
diff --git a/webrtc/video/video_send_stream_tests.cc b/webrtc/video/video_send_stream_tests.cc
index 095ff4e..9c43da2 100644
--- a/webrtc/video/video_send_stream_tests.cc
+++ b/webrtc/video/video_send_stream_tests.cc
@@ -147,7 +147,7 @@
         VideoEncoderConfig* encoder_config) override {
       send_config->rtp.extensions.clear();
       send_config->rtp.extensions.push_back(RtpExtension(
-          RtpExtension::kAbsSendTime, test::kAbsSendTimeExtensionId));
+          RtpExtension::kAbsSendTimeUri, test::kAbsSendTimeExtensionId));
     }
 
     void PerformTest() override {
@@ -189,8 +189,8 @@
         VideoEncoderConfig* encoder_config) override {
       send_config->encoder_settings.encoder = &encoder_;
       send_config->rtp.extensions.clear();
-      send_config->rtp.extensions.push_back(
-          RtpExtension(RtpExtension::kTOffset, test::kTOffsetExtensionId));
+      send_config->rtp.extensions.push_back(RtpExtension(
+          RtpExtension::kTimestampOffsetUri, test::kTOffsetExtensionId));
     }
 
     void PerformTest() override {
@@ -233,8 +233,8 @@
         VideoEncoderConfig* encoder_config) override {
       send_config->encoder_settings.encoder = &encoder_;
       send_config->rtp.extensions.clear();
-      send_config->rtp.extensions.push_back(
-          RtpExtension(RtpExtension::kTransportSequenceNumber, kExtensionId));
+      send_config->rtp.extensions.push_back(RtpExtension(
+          RtpExtension::kTransportSequenceNumberUri, kExtensionId));
     }
 
     void PerformTest() override {
@@ -422,9 +422,9 @@
             VideoSendStreamTest::kUlpfecPayloadType;
     if (header_extensions_enabled_) {
       send_config->rtp.extensions.push_back(RtpExtension(
-          RtpExtension::kAbsSendTime, test::kAbsSendTimeExtensionId));
+          RtpExtension::kAbsSendTimeUri, test::kAbsSendTimeExtensionId));
       send_config->rtp.extensions.push_back(
-          RtpExtension(RtpExtension::kTransportSequenceNumber,
+          RtpExtension(RtpExtension::kTransportSequenceNumberUri,
                        test::kTransportSequenceNumberExtensionId));
     }
     (*receive_configs)[0].rtp.fec.red_payload_type =
