diff --git a/media/engine/webrtcvideoengine.cc b/media/engine/webrtcvideoengine.cc
index 29766a7..2b20be0 100644
--- a/media/engine/webrtcvideoengine.cc
+++ b/media/engine/webrtcvideoengine.cc
@@ -455,37 +455,32 @@
   if (CodecNamesEq(codec.name, kVp9CodecName)) {
     webrtc::VideoCodecVP9 vp9_settings =
         webrtc::VideoEncoder::GetDefaultVp9Settings();
-    if (is_screencast) {
-      // TODO(asapersson): Set to 2 for now since there is a DCHECK in
-      // VideoSendStream::ReconfigureVideoEncoder.
-      vp9_settings.numberOfSpatialLayers = 2;
-      vp9_settings.numberOfTemporalLayers = 1;
-    } else {
-      const size_t default_num_spatial_layers =
-          parameters_.config.rtp.ssrcs.size();
-      const size_t num_spatial_layers =
-          GetVp9SpatialLayersFromFieldTrial().value_or(
-              default_num_spatial_layers);
+    const size_t default_num_spatial_layers =
+        parameters_.config.rtp.ssrcs.size();
+    const size_t num_spatial_layers =
+        GetVp9SpatialLayersFromFieldTrial().value_or(
+            default_num_spatial_layers);
 
-      const size_t default_num_temporal_layers =
-          num_spatial_layers > 1 ? kConferenceDefaultNumTemporalLayers : 1;
-      const size_t num_temporal_layers =
-          GetVp9TemporalLayersFromFieldTrial().value_or(
-              default_num_temporal_layers);
+    const size_t default_num_temporal_layers =
+        num_spatial_layers > 1 ? kConferenceDefaultNumTemporalLayers : 1;
+    const size_t num_temporal_layers =
+        GetVp9TemporalLayersFromFieldTrial().value_or(
+            default_num_temporal_layers);
 
-      vp9_settings.numberOfSpatialLayers = std::min<unsigned char>(
-          num_spatial_layers, kConferenceMaxNumSpatialLayers);
-      vp9_settings.numberOfTemporalLayers = std::min<unsigned char>(
-          num_temporal_layers, kConferenceMaxNumTemporalLayers);
-
-      // Limit inter-layer prediction to key pictures.
-      vp9_settings.interLayerPred = webrtc::InterLayerPredMode::kOnKeyPic;
-    }
+    vp9_settings.numberOfSpatialLayers = std::min<unsigned char>(
+        num_spatial_layers, kConferenceMaxNumSpatialLayers);
+    vp9_settings.numberOfTemporalLayers = std::min<unsigned char>(
+        num_temporal_layers, kConferenceMaxNumTemporalLayers);
 
     // VP9 denoising is disabled by default.
     vp9_settings.denoisingOn = codec_default_denoising ? true : denoising;
-    vp9_settings.frameDroppingOn = frame_dropping;
     vp9_settings.automaticResizeOn = automatic_resize;
+    // Ensure frame dropping is always enabled.
+    RTC_DCHECK(vp9_settings.frameDroppingOn);
+    if (!is_screencast) {
+      // Limit inter-layer prediction to key pictures.
+      vp9_settings.interLayerPred = webrtc::InterLayerPredMode::kOnKeyPic;
+    }
     return new rtc::RefCountedObject<
         webrtc::VideoEncoderConfig::Vp9EncoderSpecificSettings>(vp9_settings);
   }
diff --git a/media/engine/webrtcvideoengine_unittest.cc b/media/engine/webrtcvideoengine_unittest.cc
index 14723cd..b368abe 100644
--- a/media/engine/webrtcvideoengine_unittest.cc
+++ b/media/engine/webrtcvideoengine_unittest.cc
@@ -2962,14 +2962,14 @@
 
   ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set.";
   EXPECT_FALSE(vp9_settings.denoisingOn);
-  // Frame dropping always off for screen sharing.
-  EXPECT_FALSE(vp9_settings.frameDroppingOn);
+  // Frame dropping always on for screen sharing.
+  EXPECT_TRUE(vp9_settings.frameDroppingOn);
 
   stream = SetDenoisingOption(last_ssrc_, &capturer, false);
 
   ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set.";
   EXPECT_FALSE(vp9_settings.denoisingOn);
-  EXPECT_FALSE(vp9_settings.frameDroppingOn);
+  EXPECT_TRUE(vp9_settings.frameDroppingOn);
 
   EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, nullptr, nullptr));
 }
diff --git a/modules/video_coding/BUILD.gn b/modules/video_coding/BUILD.gn
index d5a76a0..269b2ca 100644
--- a/modules/video_coding/BUILD.gn
+++ b/modules/video_coding/BUILD.gn
@@ -477,8 +477,6 @@
   if (rtc_libvpx_build_vp9) {
     sources = [
       "codecs/vp9/include/vp9.h",
-      "codecs/vp9/screenshare_layers.cc",
-      "codecs/vp9/screenshare_layers.h",
       "codecs/vp9/vp9_frame_buffer_pool.cc",
       "codecs/vp9/vp9_frame_buffer_pool.h",
       "codecs/vp9/vp9_impl.cc",
@@ -816,9 +814,6 @@
       "video_receiver_unittest.cc",
       "video_sender_unittest.cc",
     ]
-    if (rtc_libvpx_build_vp9) {
-      sources += [ "codecs/vp9/vp9_screenshare_layers_unittest.cc" ]
-    }
     if (rtc_use_h264) {
       sources += [ "codecs/h264/h264_encoder_impl_unittest.cc" ]
     }
diff --git a/modules/video_coding/codecs/vp9/screenshare_layers.cc b/modules/video_coding/codecs/vp9/screenshare_layers.cc
deleted file mode 100644
index 158b0e5..0000000
--- a/modules/video_coding/codecs/vp9/screenshare_layers.cc
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
-*
-*  Use of this source code is governed by a BSD-style license
-*  that can be found in the LICENSE file in the root of the source
-*  tree. An additional intellectual property rights grant can be found
-*  in the file PATENTS.  All contributing project authors may
-*  be found in the AUTHORS file in the root of the source tree.
-*/
-
-#include "modules/video_coding/codecs/vp9/screenshare_layers.h"
-#include <algorithm>
-#include "rtc_base/checks.h"
-
-namespace webrtc {
-
-ScreenshareLayersVP9::ScreenshareLayersVP9(uint8_t num_layers)
-    : num_layers_(num_layers),
-      start_layer_(0),
-      last_timestamp_(0),
-      timestamp_initialized_(false) {
-  RTC_DCHECK_GT(num_layers, 0);
-  RTC_DCHECK_LE(num_layers, kMaxVp9NumberOfSpatialLayers);
-  memset(bits_used_, 0, sizeof(bits_used_));
-  memset(threshold_kbps_, 0, sizeof(threshold_kbps_));
-}
-
-uint8_t ScreenshareLayersVP9::GetStartLayer() const {
-  return start_layer_;
-}
-
-void ScreenshareLayersVP9::ConfigureBitrate(int threshold_kbps,
-                                            uint8_t layer_id) {
-  // The upper layer is always the layer we spill frames
-  // to when the bitrate becomes to high, therefore setting
-  // a max limit is not allowed. The top layer bitrate is
-  // never used either so configuring it makes no difference.
-  RTC_DCHECK_LT(layer_id, num_layers_ - 1);
-  threshold_kbps_[layer_id] = threshold_kbps;
-}
-
-void ScreenshareLayersVP9::LayerFrameEncoded(unsigned int size_bytes,
-                                             uint8_t layer_id) {
-  RTC_DCHECK_LT(layer_id, num_layers_);
-  bits_used_[layer_id] += size_bytes * 8;
-}
-
-VP9EncoderImpl::SuperFrameRefSettings
-ScreenshareLayersVP9::GetSuperFrameSettings(uint32_t timestamp,
-                                            bool is_keyframe) {
-  VP9EncoderImpl::SuperFrameRefSettings settings;
-  if (!timestamp_initialized_) {
-    last_timestamp_ = timestamp;
-    timestamp_initialized_ = true;
-  }
-  float time_diff = (timestamp - last_timestamp_) / 90.f;
-  float total_bits_used = 0;
-  float total_threshold_kbps = 0;
-  start_layer_ = 0;
-
-  // Up to (num_layers - 1) because we only have
-  // (num_layers - 1) thresholds to check.
-  for (int layer_id = 0; layer_id < num_layers_ - 1; ++layer_id) {
-    bits_used_[layer_id] = std::max(
-        0.f, bits_used_[layer_id] - time_diff * threshold_kbps_[layer_id]);
-    total_bits_used += bits_used_[layer_id];
-    total_threshold_kbps += threshold_kbps_[layer_id];
-
-    // If this is a keyframe then there should be no
-    // references to any previous frames.
-    if (!is_keyframe) {
-      settings.layer[layer_id].ref_buf1 = layer_id;
-      if (total_bits_used > total_threshold_kbps * 1000)
-        start_layer_ = layer_id + 1;
-    }
-
-    settings.layer[layer_id].upd_buf = layer_id;
-  }
-  // Since the above loop does not iterate over the last layer
-  // the reference of the last layer has to be set after the loop,
-  // and if this is a keyframe there should be no references to
-  // any previous frames.
-  if (!is_keyframe)
-    settings.layer[num_layers_ - 1].ref_buf1 = num_layers_ - 1;
-
-  settings.layer[num_layers_ - 1].upd_buf = num_layers_ - 1;
-  settings.is_keyframe = is_keyframe;
-  settings.start_layer = start_layer_;
-  settings.stop_layer = num_layers_ - 1;
-  last_timestamp_ = timestamp;
-  return settings;
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/vp9/screenshare_layers.h b/modules/video_coding/codecs/vp9/screenshare_layers.h
deleted file mode 100644
index 6725ab7..0000000
--- a/modules/video_coding/codecs/vp9/screenshare_layers.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/* Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
-*
-*  Use of this source code is governed by a BSD-style license
-*  that can be found in the LICENSE file in the root of the source
-*  tree. An additional intellectual property rights grant can be found
-*  in the file PATENTS.  All contributing project authors may
-*  be found in the AUTHORS file in the root of the source tree.
-*/
-
-#ifndef MODULES_VIDEO_CODING_CODECS_VP9_SCREENSHARE_LAYERS_H_
-#define MODULES_VIDEO_CODING_CODECS_VP9_SCREENSHARE_LAYERS_H_
-
-#include "modules/video_coding/codecs/vp9/vp9_impl.h"
-
-namespace webrtc {
-
-class ScreenshareLayersVP9 {
- public:
-  explicit ScreenshareLayersVP9(uint8_t num_layers);
-
-  // The target bitrate for layer with id layer_id.
-  void ConfigureBitrate(int threshold_kbps, uint8_t layer_id);
-
-  // The current start layer.
-  uint8_t GetStartLayer() const;
-
-  // Update the layer with the size of the layer frame.
-  void LayerFrameEncoded(unsigned int size_bytes, uint8_t layer_id);
-
-  // Get the layer settings for the next superframe.
-  //
-  // In short, each time the GetSuperFrameSettings is called the
-  // bitrate of every layer is calculated and if the cummulative
-  // bitrate exceeds the configured cummulative bitrates
-  // (ConfigureBitrate to configure) up to and including that
-  // layer then the resulting encoding settings for the
-  // superframe will only encode layers above that layer.
-  VP9EncoderImpl::SuperFrameRefSettings GetSuperFrameSettings(
-      uint32_t timestamp,
-      bool is_keyframe);
-
- private:
-  // How many layers that are used.
-  uint8_t num_layers_;
-
-  // The index of the first layer to encode.
-  uint8_t start_layer_;
-
-  // Cummulative target kbps for the different layers.
-  float threshold_kbps_[kMaxVp9NumberOfSpatialLayers - 1];
-
-  // How many bits that has been used for a certain layer. Increased in
-  // FrameEncoded() by the size of the encoded frame and decreased in
-  // GetSuperFrameSettings() depending on the time between frames.
-  float bits_used_[kMaxVp9NumberOfSpatialLayers];
-
-  // Timestamp of last frame.
-  uint32_t last_timestamp_;
-
-  // If the last_timestamp_ has been set.
-  bool timestamp_initialized_;
-};
-
-}  // namespace webrtc
-
-#endif  // MODULES_VIDEO_CODING_CODECS_VP9_SCREENSHARE_LAYERS_H_
diff --git a/modules/video_coding/codecs/vp9/vp9_impl.cc b/modules/video_coding/codecs/vp9/vp9_impl.cc
index 408ec15..6ff7e32 100644
--- a/modules/video_coding/codecs/vp9/vp9_impl.cc
+++ b/modules/video_coding/codecs/vp9/vp9_impl.cc
@@ -23,7 +23,6 @@
 
 #include "common_video/include/video_frame_buffer.h"
 #include "common_video/libyuv/include/webrtc_libyuv.h"
-#include "modules/video_coding/codecs/vp9/screenshare_layers.h"
 #include "modules/video_coding/codecs/vp9/svc_rate_allocator.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/keep_ref_until_done.h"
@@ -79,10 +78,7 @@
       num_temporal_layers_(0),
       num_spatial_layers_(0),
       inter_layer_pred_(InterLayerPredMode::kOn),
-      is_flexible_mode_(false),
-      frames_encoded_(0),
-      // Use two spatial when screensharing with flexible mode.
-      spatial_layer_(new ScreenshareLayersVP9(2)) {
+      is_flexible_mode_(false) {
   memset(&codec_, 0, sizeof(codec_));
   memset(&svc_params_, 0, sizeof(vpx_svc_extra_cfg_t));
 }
@@ -130,7 +126,6 @@
   uint8_t i = 0;
 
   config_->rc_target_bitrate = bitrate_allocation.get_sum_kbps();
-  spatial_layer_->ConfigureBitrate(bitrate_allocation.get_sum_kbps(), 0);
 
   if (ExplicitlyConfiguredSpatialLayers()) {
     for (size_t sl_idx = 0; sl_idx < num_spatial_layers_; ++sl_idx) {
@@ -342,12 +337,11 @@
   // TODO(asapersson): Check configuration of temporal switch up and increase
   // pattern length.
   is_flexible_mode_ = inst->VP9().flexibleMode;
-  if (is_flexible_mode_) {
-    config_->temporal_layering_mode = VP9E_TEMPORAL_LAYERING_MODE_BYPASS;
-    config_->ts_number_layers = num_temporal_layers_;
-    if (codec_.mode == kScreensharing)
-      spatial_layer_->ConfigureBitrate(inst->startBitrate, 0);
-  } else if (num_temporal_layers_ == 1) {
+
+  // TODO(ssilkin): Only non-flexible mode is supported for now.
+  RTC_DCHECK(!is_flexible_mode_);
+
+  if (num_temporal_layers_ == 1) {
     gof_.SetGofInfoVP9(kTemporalStructureMode1);
     config_->temporal_layering_mode = VP9E_TEMPORAL_LAYERING_MODE_NOLAYERING;
     config_->ts_number_layers = 1;
@@ -490,6 +484,22 @@
       default:
         RTC_NOTREACHED();
     }
+
+    if (!is_flexible_mode_) {
+      // In RTP non-flexible mode, frame dropping of individual layers in a
+      // superframe leads to incorrect reference picture ID values in the
+      // RTP header. Dropping the entire superframe if the base is dropped
+      // or not dropping upper layers if base is not dropped mitigates
+      // the problem.
+      vpx_svc_frame_drop_t svc_drop_frame;
+      svc_drop_frame.framedrop_mode = CONSTRAINED_LAYER_DROP;
+      for (size_t i = 0; i < num_spatial_layers_; ++i) {
+        svc_drop_frame.framedrop_thresh[i] =
+            (i == 0) ? config_->rc_dropframe_thresh : 0;
+      }
+      vpx_codec_control(encoder_, VP9E_SET_SVC_FRAME_DROP_LAYER,
+                        &svc_drop_frame);
+    }
   }
 
   // Register callback for getting each spatial layer.
@@ -582,41 +592,6 @@
     flags = VPX_EFLAG_FORCE_KF;
   }
 
-  if (is_flexible_mode_) {
-    SuperFrameRefSettings settings;
-
-    // These structs are copied when calling vpx_codec_control,
-    // therefore it is ok for them to go out of scope.
-    vpx_svc_ref_frame_config enc_layer_conf;
-    vpx_svc_layer_id layer_id;
-
-    if (codec_.mode == kRealtimeVideo) {
-      // Real time video not yet implemented in flexible mode.
-      RTC_NOTREACHED();
-    } else {
-      settings = spatial_layer_->GetSuperFrameSettings(input_image.timestamp(),
-                                                       force_key_frame_);
-    }
-    enc_layer_conf = GenerateRefsAndFlags(settings);
-    layer_id.temporal_layer_id = 0;
-    layer_id.spatial_layer_id = settings.start_layer;
-    vpx_codec_control(encoder_, VP9E_SET_SVC_LAYER_ID, &layer_id);
-    vpx_codec_control(encoder_, VP9E_SET_SVC_REF_FRAME_CONFIG, &enc_layer_conf);
-  } else if (codec_.mode == kRealtimeVideo && num_spatial_layers_ > 1) {
-    // In RTP non-flexible mode, frame dropping of individual layers in a
-    // superframe leads to incorrect reference picture ID values in the
-    // RTP header. Dropping the entire superframe if the base is dropped
-    // or not dropping upper layers if base is not dropped mitigates
-    // the problem.
-    vpx_svc_frame_drop_t svc_drop_frame;
-    svc_drop_frame.framedrop_mode = CONSTRAINED_LAYER_DROP;
-    for (size_t i = 0; i < num_spatial_layers_; ++i) {
-      svc_drop_frame.framedrop_thresh[i] =
-        (i == 0) ? config_->rc_dropframe_thresh : 0;
-    }
-    vpx_codec_control(encoder_, VP9E_SET_SVC_FRAME_DROP_LAYER, &svc_drop_frame);
-  }
-
   RTC_CHECK_GT(codec_.maxFramerate, 0);
   uint32_t duration = 90000 / codec_.maxFramerate;
   if (vpx_codec_encode(encoder_, raw_, timestamp_, duration, flags,
@@ -703,18 +678,12 @@
   // bit.
   vp9_info->num_spatial_layers = num_spatial_layers_;
 
-  vp9_info->num_ref_pics = 0;
-  if (vp9_info->flexible_mode) {
-    vp9_info->gof_idx = kNoGofIdx;
-    vp9_info->num_ref_pics = num_ref_pics_[layer_id.spatial_layer_id];
-    for (int i = 0; i < num_ref_pics_[layer_id.spatial_layer_id]; ++i) {
-      vp9_info->p_diff[i] = p_diff_[layer_id.spatial_layer_id][i];
-    }
-  } else {
-    vp9_info->gof_idx =
-        static_cast<uint8_t>(pics_since_key_ % gof_.num_frames_in_gof);
-    vp9_info->temporal_up_switch = gof_.temporal_up_switch[vp9_info->gof_idx];
-  }
+  RTC_DCHECK(!vp9_info->flexible_mode);
+  vp9_info->gof_idx =
+      static_cast<uint8_t>(pics_since_key_ % gof_.num_frames_in_gof);
+  vp9_info->temporal_up_switch = gof_.temporal_up_switch[vp9_info->gof_idx];
+  vp9_info->num_ref_pics =
+      is_key_pic ? 0 : gof_.num_ref_pics[vp9_info->gof_idx];
 
   if (vp9_info->ss_data_available) {
     vp9_info->spatial_layer_resolution_present = true;
@@ -758,12 +727,6 @@
   memcpy(encoded_image_._buffer, pkt->data.frame.buf, pkt->data.frame.sz);
   encoded_image_._length = pkt->data.frame.sz;
 
-  if (is_flexible_mode_ && codec_.mode == kScreensharing) {
-    spatial_layer_->LayerFrameEncoded(
-        static_cast<unsigned int>(encoded_image_._length),
-        layer_id.spatial_layer_id);
-  }
-
   const bool is_key_frame =
       (pkt->data.frame.flags & VPX_FRAME_IS_KEY) ? true : false;
   // Ensure encoder issued key frame on request.
@@ -819,108 +782,6 @@
   }
 }
 
-vpx_svc_ref_frame_config VP9EncoderImpl::GenerateRefsAndFlags(
-    const SuperFrameRefSettings& settings) {
-  static const vpx_enc_frame_flags_t kAllFlags =
-      VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_LAST |
-      VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_GF;
-  vpx_svc_ref_frame_config sf_conf = {};
-  if (settings.is_keyframe) {
-    // Used later on to make sure we don't make any invalid references.
-    memset(buffer_updated_at_frame_, -1, sizeof(buffer_updated_at_frame_));
-    for (int layer = settings.start_layer; layer <= settings.stop_layer;
-         ++layer) {
-      num_ref_pics_[layer] = 0;
-      buffer_updated_at_frame_[settings.layer[layer].upd_buf] = frames_encoded_;
-      // When encoding a keyframe only the alt_fb_idx is used
-      // to specify which layer ends up in which buffer.
-      sf_conf.alt_fb_idx[layer] = settings.layer[layer].upd_buf;
-    }
-  } else {
-    for (int layer_idx = settings.start_layer; layer_idx <= settings.stop_layer;
-         ++layer_idx) {
-      vpx_enc_frame_flags_t layer_flags = kAllFlags;
-      num_ref_pics_[layer_idx] = 0;
-      int8_t refs[3] = {settings.layer[layer_idx].ref_buf1,
-                        settings.layer[layer_idx].ref_buf2,
-                        settings.layer[layer_idx].ref_buf3};
-
-      for (unsigned int ref_idx = 0; ref_idx < kMaxVp9RefPics; ++ref_idx) {
-        if (refs[ref_idx] == -1)
-          continue;
-
-        RTC_DCHECK_GE(refs[ref_idx], 0);
-        RTC_DCHECK_LE(refs[ref_idx], 7);
-        // Easier to remove flags from all flags rather than having to
-        // build the flags from 0.
-        switch (num_ref_pics_[layer_idx]) {
-          case 0: {
-            sf_conf.lst_fb_idx[layer_idx] = refs[ref_idx];
-            layer_flags &= ~VP8_EFLAG_NO_REF_LAST;
-            break;
-          }
-          case 1: {
-            sf_conf.gld_fb_idx[layer_idx] = refs[ref_idx];
-            layer_flags &= ~VP8_EFLAG_NO_REF_GF;
-            break;
-          }
-          case 2: {
-            sf_conf.alt_fb_idx[layer_idx] = refs[ref_idx];
-            layer_flags &= ~VP8_EFLAG_NO_REF_ARF;
-            break;
-          }
-        }
-        // Make sure we don't reference a buffer that hasn't been
-        // used at all or hasn't been used since a keyframe.
-        RTC_DCHECK_NE(buffer_updated_at_frame_[refs[ref_idx]], -1);
-
-        p_diff_[layer_idx][num_ref_pics_[layer_idx]] =
-            frames_encoded_ - buffer_updated_at_frame_[refs[ref_idx]];
-        num_ref_pics_[layer_idx]++;
-      }
-
-      bool upd_buf_same_as_a_ref = false;
-      if (settings.layer[layer_idx].upd_buf != -1) {
-        for (unsigned int ref_idx = 0; ref_idx < kMaxVp9RefPics; ++ref_idx) {
-          if (settings.layer[layer_idx].upd_buf == refs[ref_idx]) {
-            switch (ref_idx) {
-              case 0: {
-                layer_flags &= ~VP8_EFLAG_NO_UPD_LAST;
-                break;
-              }
-              case 1: {
-                layer_flags &= ~VP8_EFLAG_NO_UPD_GF;
-                break;
-              }
-              case 2: {
-                layer_flags &= ~VP8_EFLAG_NO_UPD_ARF;
-                break;
-              }
-            }
-            upd_buf_same_as_a_ref = true;
-            break;
-          }
-        }
-        if (!upd_buf_same_as_a_ref) {
-          // If we have three references and a buffer is specified to be
-          // updated, then that buffer must be the same as one of the
-          // three references.
-          RTC_CHECK_LT(num_ref_pics_[layer_idx], kMaxVp9RefPics);
-
-          sf_conf.alt_fb_idx[layer_idx] = settings.layer[layer_idx].upd_buf;
-          layer_flags ^= VP8_EFLAG_NO_UPD_ARF;
-        }
-
-        int updated_buffer = settings.layer[layer_idx].upd_buf;
-        buffer_updated_at_frame_[updated_buffer] = frames_encoded_;
-        sf_conf.frame_flags[layer_idx] = layer_flags;
-      }
-    }
-  }
-  ++frames_encoded_;
-  return sf_conf;
-}
-
 int VP9EncoderImpl::SetChannelParameters(uint32_t packet_loss, int64_t rtt) {
   return WEBRTC_VIDEO_CODEC_OK;
 }
diff --git a/modules/video_coding/codecs/vp9/vp9_impl.h b/modules/video_coding/codecs/vp9/vp9_impl.h
index 6da3dce..509f04e 100644
--- a/modules/video_coding/codecs/vp9/vp9_impl.h
+++ b/modules/video_coding/codecs/vp9/vp9_impl.h
@@ -24,8 +24,6 @@
 
 namespace webrtc {
 
-class ScreenshareLayersVP9;
-
 class VP9EncoderImpl : public VP9Encoder {
  public:
   VP9EncoderImpl();
@@ -51,20 +49,6 @@
 
   const char* ImplementationName() const override;
 
-  struct LayerFrameRefSettings {
-    int8_t upd_buf = -1;   // -1 - no update,    0..7 - update buffer 0..7
-    int8_t ref_buf1 = -1;  // -1 - no reference, 0..7 - reference buffer 0..7
-    int8_t ref_buf2 = -1;  // -1 - no reference, 0..7 - reference buffer 0..7
-    int8_t ref_buf3 = -1;  // -1 - no reference, 0..7 - reference buffer 0..7
-  };
-
-  struct SuperFrameRefSettings {
-    LayerFrameRefSettings layer[kMaxVp9NumberOfSpatialLayers];
-    uint8_t start_layer = 0;  // The first spatial layer to be encoded.
-    uint8_t stop_layer = 0;   // The last spatial layer to be encoded.
-    bool is_keyframe = false;
-  };
-
  private:
   // Determine number of encoder threads to use.
   int NumberOfThreads(int width, int height, int number_of_cores);
@@ -80,15 +64,6 @@
   bool ExplicitlyConfiguredSpatialLayers() const;
   bool SetSvcRates(const VideoBitrateAllocation& bitrate_allocation);
 
-  // Used for flexible mode to set the flags and buffer references used
-  // by the encoder. Also calculates the references used by the RTP
-  // packetizer.
-  //
-  // Has to be called for every frame (keyframes included) to update the
-  // state used to calculate references.
-  vpx_svc_ref_frame_config GenerateRefsAndFlags(
-      const SuperFrameRefSettings& settings);
-
   virtual int GetEncodedLayerFrame(const vpx_codec_cx_pkt* pkt);
 
   // Callback function for outputting packets per spatial layer.
@@ -97,6 +72,8 @@
 
   void DeliverBufferedFrame(bool end_of_picture);
 
+  bool DropFrame(uint32_t rtp_timestamp);
+
   // Determine maximum target for Intra frames
   //
   // Input:
@@ -128,11 +105,6 @@
 
   // Used for flexible mode.
   bool is_flexible_mode_;
-  int64_t buffer_updated_at_frame_[kNumVp9Buffers];
-  int64_t frames_encoded_;
-  uint8_t num_ref_pics_[kMaxVp9NumberOfSpatialLayers];
-  uint8_t p_diff_[kMaxVp9NumberOfSpatialLayers][kMaxVp9RefPics];
-  std::unique_ptr<ScreenshareLayersVP9> spatial_layer_;
 };
 
 class VP9DecoderImpl : public VP9Decoder {
diff --git a/modules/video_coding/codecs/vp9/vp9_screenshare_layers_unittest.cc b/modules/video_coding/codecs/vp9/vp9_screenshare_layers_unittest.cc
deleted file mode 100644
index 5ef7470..0000000
--- a/modules/video_coding/codecs/vp9/vp9_screenshare_layers_unittest.cc
+++ /dev/null
@@ -1,324 +0,0 @@
-/*
- *  Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- */
-
-#include <limits>
-#include <memory>
-
-#include "vpx/vp8cx.h"
-#include "modules/video_coding/codecs/vp9/screenshare_layers.h"
-#include "modules/video_coding/codecs/vp9/vp9_impl.h"
-#include "rtc_base/logging.h"
-#include "system_wrappers/include/clock.h"
-#include "test/gtest.h"
-
-namespace webrtc {
-
-typedef VP9EncoderImpl::SuperFrameRefSettings Settings;
-
-const uint32_t kTickFrequency = 90000;
-
-class ScreenshareLayerTestVP9 : public ::testing::Test {
- protected:
-  ScreenshareLayerTestVP9() : clock_(0) {}
-  virtual ~ScreenshareLayerTestVP9() {}
-
-  void InitScreenshareLayers(int layers) {
-    layers_.reset(new ScreenshareLayersVP9(layers));
-  }
-
-  void ConfigureBitrateForLayer(int kbps, uint8_t layer_id) {
-    layers_->ConfigureBitrate(kbps, layer_id);
-  }
-
-  void AdvanceTime(int64_t milliseconds) {
-    clock_.AdvanceTimeMilliseconds(milliseconds);
-  }
-
-  void AddKilobitsToLayer(int kilobits, uint8_t layer_id) {
-    layers_->LayerFrameEncoded(kilobits * 1000 / 8, layer_id);
-  }
-
-  void EqualRefsForLayer(const Settings& actual, uint8_t layer_id) {
-    EXPECT_EQ(expected_.layer[layer_id].upd_buf,
-              actual.layer[layer_id].upd_buf);
-    EXPECT_EQ(expected_.layer[layer_id].ref_buf1,
-              actual.layer[layer_id].ref_buf1);
-    EXPECT_EQ(expected_.layer[layer_id].ref_buf2,
-              actual.layer[layer_id].ref_buf2);
-    EXPECT_EQ(expected_.layer[layer_id].ref_buf3,
-              actual.layer[layer_id].ref_buf3);
-  }
-
-  void EqualRefs(const Settings& actual) {
-    for (unsigned int layer_id = 0; layer_id < kMaxVp9NumberOfSpatialLayers;
-         ++layer_id) {
-      EqualRefsForLayer(actual, layer_id);
-    }
-  }
-
-  void EqualStartStopKeyframe(const Settings& actual) {
-    EXPECT_EQ(expected_.start_layer, actual.start_layer);
-    EXPECT_EQ(expected_.stop_layer, actual.stop_layer);
-    EXPECT_EQ(expected_.is_keyframe, actual.is_keyframe);
-  }
-
-  // Check that the settings returned by GetSuperFrameSettings() is
-  // equal to the expected_ settings.
-  void EqualToExpected() {
-    uint32_t frame_timestamp_ =
-        clock_.TimeInMilliseconds() * (kTickFrequency / 1000);
-    Settings actual =
-        layers_->GetSuperFrameSettings(frame_timestamp_, expected_.is_keyframe);
-    EqualRefs(actual);
-    EqualStartStopKeyframe(actual);
-  }
-
-  Settings expected_;
-  SimulatedClock clock_;
-  std::unique_ptr<ScreenshareLayersVP9> layers_;
-};
-
-TEST_F(ScreenshareLayerTestVP9, NoRefsOnKeyFrame) {
-  const int kNumLayers = kMaxVp9NumberOfSpatialLayers;
-  InitScreenshareLayers(kNumLayers);
-  expected_.start_layer = 0;
-  expected_.stop_layer = kNumLayers - 1;
-
-  for (int l = 0; l < kNumLayers; ++l) {
-    expected_.layer[l].upd_buf = l;
-  }
-  expected_.is_keyframe = true;
-  EqualToExpected();
-
-  for (int l = 0; l < kNumLayers; ++l) {
-    expected_.layer[l].ref_buf1 = l;
-  }
-  expected_.is_keyframe = false;
-  EqualToExpected();
-}
-
-// Test if it is possible to send at a high bitrate (over the threshold)
-// after a longer period of low bitrate. This should not be possible.
-TEST_F(ScreenshareLayerTestVP9, DontAccumelateAvailableBitsOverTime) {
-  InitScreenshareLayers(2);
-  ConfigureBitrateForLayer(100, 0);
-
-  expected_.layer[0].upd_buf = 0;
-  expected_.layer[0].ref_buf1 = 0;
-  expected_.layer[1].upd_buf = 1;
-  expected_.layer[1].ref_buf1 = 1;
-  expected_.start_layer = 0;
-  expected_.stop_layer = 1;
-
-  // Send 10 frames at a low bitrate (50 kbps)
-  for (int i = 0; i < 10; ++i) {
-    AdvanceTime(200);
-    EqualToExpected();
-    AddKilobitsToLayer(10, 0);
-  }
-
-  AdvanceTime(200);
-  EqualToExpected();
-  AddKilobitsToLayer(301, 0);
-
-  // Send 10 frames at a high bitrate (200 kbps)
-  expected_.start_layer = 1;
-  for (int i = 0; i < 10; ++i) {
-    AdvanceTime(200);
-    EqualToExpected();
-    AddKilobitsToLayer(40, 1);
-  }
-}
-
-// Test if used bits are accumelated over layers, as they should;
-TEST_F(ScreenshareLayerTestVP9, AccumelateUsedBitsOverLayers) {
-  const int kNumLayers = kMaxVp9NumberOfSpatialLayers;
-  InitScreenshareLayers(kNumLayers);
-  for (int l = 0; l < kNumLayers - 1; ++l)
-    ConfigureBitrateForLayer(100, l);
-  for (int l = 0; l < kNumLayers; ++l) {
-    expected_.layer[l].upd_buf = l;
-    expected_.layer[l].ref_buf1 = l;
-  }
-
-  expected_.start_layer = 0;
-  expected_.stop_layer = kNumLayers - 1;
-  EqualToExpected();
-
-  for (int layer = 0; layer < kNumLayers - 1; ++layer) {
-    expected_.start_layer = layer;
-    EqualToExpected();
-    AddKilobitsToLayer(101, layer);
-  }
-}
-
-// General testing of the bitrate controller.
-TEST_F(ScreenshareLayerTestVP9, 2LayerBitrate) {
-  InitScreenshareLayers(2);
-  ConfigureBitrateForLayer(100, 0);
-
-  expected_.layer[0].upd_buf = 0;
-  expected_.layer[1].upd_buf = 1;
-  expected_.layer[0].ref_buf1 = -1;
-  expected_.layer[1].ref_buf1 = -1;
-  expected_.start_layer = 0;
-  expected_.stop_layer = 1;
-
-  expected_.is_keyframe = true;
-  EqualToExpected();
-  AddKilobitsToLayer(100, 0);
-
-  expected_.layer[0].ref_buf1 = 0;
-  expected_.layer[1].ref_buf1 = 1;
-  expected_.is_keyframe = false;
-  AdvanceTime(199);
-  EqualToExpected();
-  AddKilobitsToLayer(100, 0);
-
-  expected_.start_layer = 1;
-  for (int frame = 0; frame < 3; ++frame) {
-    AdvanceTime(200);
-    EqualToExpected();
-    AddKilobitsToLayer(100, 1);
-  }
-
-  // Just before enough bits become available for L0 @0.999 seconds.
-  AdvanceTime(199);
-  EqualToExpected();
-  AddKilobitsToLayer(100, 1);
-
-  // Just after enough bits become available for L0 @1.0001 seconds.
-  expected_.start_layer = 0;
-  AdvanceTime(2);
-  EqualToExpected();
-  AddKilobitsToLayer(100, 0);
-
-  // Keyframes always encode all layers, even if it is over budget.
-  expected_.layer[0].ref_buf1 = -1;
-  expected_.layer[1].ref_buf1 = -1;
-  expected_.is_keyframe = true;
-  AdvanceTime(499);
-  EqualToExpected();
-  expected_.layer[0].ref_buf1 = 0;
-  expected_.layer[1].ref_buf1 = 1;
-  expected_.start_layer = 1;
-  expected_.is_keyframe = false;
-  EqualToExpected();
-  AddKilobitsToLayer(100, 0);
-
-  // 400 kb in L0 --> @3 second mark to fall below the threshold..
-  // just before @2.999 seconds.
-  expected_.is_keyframe = false;
-  AdvanceTime(1499);
-  EqualToExpected();
-  AddKilobitsToLayer(100, 1);
-
-  // just after @3.001 seconds.
-  expected_.start_layer = 0;
-  AdvanceTime(2);
-  EqualToExpected();
-  AddKilobitsToLayer(100, 0);
-}
-
-// General testing of the bitrate controller.
-TEST_F(ScreenshareLayerTestVP9, 3LayerBitrate) {
-  InitScreenshareLayers(3);
-  ConfigureBitrateForLayer(100, 0);
-  ConfigureBitrateForLayer(100, 1);
-
-  for (int l = 0; l < 3; ++l) {
-    expected_.layer[l].upd_buf = l;
-    expected_.layer[l].ref_buf1 = l;
-  }
-  expected_.start_layer = 0;
-  expected_.stop_layer = 2;
-
-  EqualToExpected();
-  AddKilobitsToLayer(105, 0);
-  AddKilobitsToLayer(30, 1);
-
-  AdvanceTime(199);
-  EqualToExpected();
-  AddKilobitsToLayer(105, 0);
-  AddKilobitsToLayer(30, 1);
-
-  expected_.start_layer = 1;
-  AdvanceTime(200);
-  EqualToExpected();
-  AddKilobitsToLayer(130, 1);
-
-  expected_.start_layer = 2;
-  AdvanceTime(200);
-  EqualToExpected();
-
-  // 400 kb in L1 --> @1.0 second mark to fall below threshold.
-  // 210 kb in L0 --> @1.1 second mark to fall below threshold.
-  // Just before L1 @0.999 seconds.
-  AdvanceTime(399);
-  EqualToExpected();
-
-  // Just after L1 @1.001 seconds.
-  expected_.start_layer = 1;
-  AdvanceTime(2);
-  EqualToExpected();
-
-  // Just before L0 @1.099 seconds.
-  AdvanceTime(99);
-  EqualToExpected();
-
-  // Just after L0 @1.101 seconds.
-  expected_.start_layer = 0;
-  AdvanceTime(2);
-  EqualToExpected();
-
-  // @1.1 seconds
-  AdvanceTime(99);
-  EqualToExpected();
-  AddKilobitsToLayer(200, 1);
-
-  expected_.is_keyframe = true;
-  for (int l = 0; l < 3; ++l)
-    expected_.layer[l].ref_buf1 = -1;
-  AdvanceTime(200);
-  EqualToExpected();
-
-  expected_.is_keyframe = false;
-  expected_.start_layer = 2;
-  for (int l = 0; l < 3; ++l)
-    expected_.layer[l].ref_buf1 = l;
-  AdvanceTime(200);
-  EqualToExpected();
-}
-
-// Test that the bitrate calculations are
-// correct when the timestamp wrap.
-TEST_F(ScreenshareLayerTestVP9, TimestampWrap) {
-  InitScreenshareLayers(2);
-  ConfigureBitrateForLayer(100, 0);
-
-  expected_.layer[0].upd_buf = 0;
-  expected_.layer[0].ref_buf1 = 0;
-  expected_.layer[1].upd_buf = 1;
-  expected_.layer[1].ref_buf1 = 1;
-  expected_.start_layer = 0;
-  expected_.stop_layer = 1;
-
-  // Advance time to just before the timestamp wraps.
-  AdvanceTime(std::numeric_limits<uint32_t>::max() / (kTickFrequency / 1000));
-  EqualToExpected();
-  AddKilobitsToLayer(200, 0);
-
-  // Wrap
-  expected_.start_layer = 1;
-  AdvanceTime(1);
-  EqualToExpected();
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/video_codec_initializer.cc b/modules/video_coding/video_codec_initializer.cc
index adc7f32..f122070 100644
--- a/modules/video_coding/video_codec_initializer.cc
+++ b/modules/video_coding/video_codec_initializer.cc
@@ -195,54 +195,46 @@
       RTC_DCHECK_LE(video_codec.VP9()->numberOfTemporalLayers,
                     kMaxTemporalStreams);
 
-      if (video_codec.mode == kScreensharing &&
-          config.encoder_specific_settings) {
-        video_codec.VP9()->flexibleMode = true;
-        // For now VP9 screensharing use 1 temporal and 2 spatial layers.
-        RTC_DCHECK_EQ(1, video_codec.VP9()->numberOfTemporalLayers);
-        RTC_DCHECK_EQ(2, video_codec.VP9()->numberOfSpatialLayers);
+      RTC_DCHECK(config.spatial_layers.empty() ||
+                 config.spatial_layers.size() ==
+                     video_codec.VP9()->numberOfSpatialLayers);
+
+      std::vector<SpatialLayer> spatial_layers;
+      if (!config.spatial_layers.empty()) {
+        // Layering is set explicitly.
+        spatial_layers = config.spatial_layers;
       } else {
-        RTC_DCHECK(config.spatial_layers.empty() ||
-                   config.spatial_layers.size() ==
-                       video_codec.VP9()->numberOfSpatialLayers);
+        spatial_layers = GetSvcConfig(video_codec.width, video_codec.height,
+                                      video_codec.VP9()->numberOfSpatialLayers,
+                                      video_codec.VP9()->numberOfTemporalLayers,
+                                      video_codec.mode == kScreensharing);
 
-        std::vector<SpatialLayer> spatial_layers;
-        if (!config.spatial_layers.empty()) {
-          // Layering is set explicitly.
-          spatial_layers = config.spatial_layers;
-        } else {
-          spatial_layers =
-              GetSvcConfig(video_codec.width, video_codec.height,
-                           video_codec.VP9()->numberOfSpatialLayers,
-                           video_codec.VP9()->numberOfTemporalLayers, false);
-
-          const bool no_spatial_layering = (spatial_layers.size() == 1);
-          if (no_spatial_layering) {
-            // Use codec's bitrate limits.
-            spatial_layers.back().minBitrate = video_codec.minBitrate;
-            spatial_layers.back().maxBitrate = video_codec.maxBitrate;
-          }
+        const bool no_spatial_layering = (spatial_layers.size() == 1);
+        if (no_spatial_layering) {
+          // Use codec's bitrate limits.
+          spatial_layers.back().minBitrate = video_codec.minBitrate;
+          spatial_layers.back().maxBitrate = video_codec.maxBitrate;
         }
-
-        RTC_DCHECK(!spatial_layers.empty());
-        for (size_t i = 0; i < spatial_layers.size(); ++i) {
-          video_codec.spatialLayers[i] = spatial_layers[i];
-        }
-
-        // Update layering settings.
-        video_codec.VP9()->numberOfSpatialLayers =
-            static_cast<unsigned char>(spatial_layers.size());
-        RTC_DCHECK_GE(video_codec.VP9()->numberOfSpatialLayers, 1);
-        RTC_DCHECK_LE(video_codec.VP9()->numberOfSpatialLayers,
-                      kMaxSpatialLayers);
-
-        video_codec.VP9()->numberOfTemporalLayers = static_cast<unsigned char>(
-            spatial_layers.back().numberOfTemporalLayers);
-        RTC_DCHECK_GE(video_codec.VP9()->numberOfTemporalLayers, 1);
-        RTC_DCHECK_LE(video_codec.VP9()->numberOfTemporalLayers,
-                      kMaxTemporalStreams);
       }
 
+      RTC_DCHECK(!spatial_layers.empty());
+      for (size_t i = 0; i < spatial_layers.size(); ++i) {
+        video_codec.spatialLayers[i] = spatial_layers[i];
+      }
+
+      // Update layering settings.
+      video_codec.VP9()->numberOfSpatialLayers =
+          static_cast<unsigned char>(spatial_layers.size());
+      RTC_DCHECK_GE(video_codec.VP9()->numberOfSpatialLayers, 1);
+      RTC_DCHECK_LE(video_codec.VP9()->numberOfSpatialLayers,
+                    kMaxSpatialLayers);
+
+      video_codec.VP9()->numberOfTemporalLayers = static_cast<unsigned char>(
+          spatial_layers.back().numberOfTemporalLayers);
+      RTC_DCHECK_GE(video_codec.VP9()->numberOfTemporalLayers, 1);
+      RTC_DCHECK_LE(video_codec.VP9()->numberOfTemporalLayers,
+                    kMaxTemporalStreams);
+
       break;
     }
     case kVideoCodecH264: {
diff --git a/video/video_send_stream_tests.cc b/video/video_send_stream_tests.cc
index 4a72e25..6775813 100644
--- a/video/video_send_stream_tests.cc
+++ b/video/video_send_stream_tests.cc
@@ -3571,7 +3571,10 @@
 // Crashes on Android; bugs.webrtc.org/7401
 #define MAYBE_Vp9FlexModeRefCount DISABLED_Vp9FlexModeRefCount
 #else
-#define MAYBE_Vp9FlexModeRefCount Vp9FlexModeRefCount
+// TODO(webrtc:9270): Support of flexible mode is temporarily disabled. Enable
+// the test after webrtc:9270 is implemented.
+#define MAYBE_Vp9FlexModeRefCount DISABLED_Vp9FlexModeRefCount
+// #define MAYBE_Vp9FlexModeRefCount Vp9FlexModeRefCount
 #endif
 TEST_F(VideoSendStreamTest, MAYBE_Vp9FlexModeRefCount) {
   class FlexibleMode : public Vp9HeaderObserver {
