Update from https://crrev.com/303153

This updates from chromium https://crrev.com/303153 aka
f9567f85788355bf3da8df030cbc232421d00b7d with the following additional
changes:

Update skia_build.patch and cc_strip_video.patch with trivial changes.

Update gpu::CommandBuffer state serialization for upstream changes.

Update ui/compositor/layer for upstream cc::SurfaceLayer changes.

TBR=jam@chromium.org

Review URL: https://codereview.chromium.org/706203003
diff --git a/net/quic/congestion_control/rtt_stats.cc b/net/quic/congestion_control/rtt_stats.cc
index 7b25b6c..dfb50ef 100644
--- a/net/quic/congestion_control/rtt_stats.cc
+++ b/net/quic/congestion_control/rtt_stats.cc
@@ -32,10 +32,6 @@
       num_min_rtt_samples_remaining_(0),
       recent_min_rtt_window_(QuicTime::Delta::Infinite()) {}
 
-bool RttStats::HasUpdates() const {
-  return !smoothed_rtt_.IsZero();
-}
-
 void RttStats::SampleNewRecentMinRtt(uint32 num_samples) {
   num_min_rtt_samples_remaining_ = num_samples;
   new_min_rtt_ = RttSample();
@@ -78,7 +74,7 @@
   }
   latest_rtt_ = rtt_sample;
   // First time call.
-  if (!HasUpdates()) {
+  if (smoothed_rtt_.IsZero()) {
     smoothed_rtt_ = rtt_sample;
     mean_deviation_ = QuicTime::Delta::FromMicroseconds(
         rtt_sample.ToMicroseconds() / 2);
@@ -131,18 +127,4 @@
   }
 }
 
-QuicTime::Delta RttStats::SmoothedRtt() const {
-  if (!HasUpdates()) {
-    return QuicTime::Delta::FromMicroseconds(initial_rtt_us_);
-  }
-  return smoothed_rtt_;
-}
-
-QuicTime::Delta RttStats::MinRtt() const {
-  if (!HasUpdates()) {
-    return QuicTime::Delta::FromMicroseconds(initial_rtt_us_);
-  }
-  return min_rtt_;
-}
-
 }  // namespace net
diff --git a/net/quic/congestion_control/rtt_stats.h b/net/quic/congestion_control/rtt_stats.h
index b7ec6b9..9dd5620 100644
--- a/net/quic/congestion_control/rtt_stats.h
+++ b/net/quic/congestion_control/rtt_stats.h
@@ -41,12 +41,11 @@
   // |num_samples| UpdateRtt calls.
   void SampleNewRecentMinRtt(uint32 num_samples);
 
-  QuicTime::Delta SmoothedRtt() const;
-
-  // Returns the min_rtt for the entire connection if a min has been measured.
-  // This returns an initial non-zero RTT estimate if no measurements have yet
-  // been made.
-  QuicTime::Delta MinRtt() const;
+  // Returns the EWMA smoothed RTT for the connection.
+  // May return Zero if no valid updates have occurred.
+  QuicTime::Delta smoothed_rtt() const {
+    return smoothed_rtt_;
+  }
 
   int64 initial_rtt_us() const {
     return initial_rtt_us_;
@@ -57,10 +56,18 @@
     initial_rtt_us_ = initial_rtt_us;
   }
 
+  // The most recent rtt measurement.
+  // May return Zero if no valid updates have occurred.
   QuicTime::Delta latest_rtt() const {
     return latest_rtt_;
   }
 
+  // Returns the min_rtt for the entire connection.
+  // May return Zero if no valid updates have occurred.
+  QuicTime::Delta min_rtt() const {
+    return min_rtt_;
+  }
+
   // Returns the min_rtt since SampleNewRecentMinRtt has been called, or the
   // min_rtt for the entire connection if SampleNewMinRtt was never called.
   QuicTime::Delta recent_min_rtt() const {
diff --git a/net/quic/congestion_control/rtt_stats_test.cc b/net/quic/congestion_control/rtt_stats_test.cc
index d3a683e..6aaf2a6 100644
--- a/net/quic/congestion_control/rtt_stats_test.cc
+++ b/net/quic/congestion_control/rtt_stats_test.cc
@@ -37,10 +37,8 @@
 
 TEST_F(RttStatsTest, DefaultsBeforeUpdate) {
   EXPECT_LT(0u, rtt_stats_.initial_rtt_us());
-  EXPECT_EQ(QuicTime::Delta::FromMicroseconds(rtt_stats_.initial_rtt_us()),
-            rtt_stats_.MinRtt());
-  EXPECT_EQ(QuicTime::Delta::FromMicroseconds(rtt_stats_.initial_rtt_us()),
-            rtt_stats_.SmoothedRtt());
+  EXPECT_EQ(QuicTime::Delta::Zero(), rtt_stats_.min_rtt());
+  EXPECT_EQ(QuicTime::Delta::Zero(), rtt_stats_.smoothed_rtt());
 }
 
 TEST_F(RttStatsTest, SmoothedRtt) {
@@ -49,58 +47,58 @@
                        QuicTime::Delta::FromMilliseconds(100),
                        QuicTime::Zero());
   EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), rtt_stats_.latest_rtt());
-  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), rtt_stats_.SmoothedRtt());
+  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), rtt_stats_.smoothed_rtt());
   // Verify that effective RTT of zero does not change Smoothed RTT.
   rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(200),
                        QuicTime::Delta::FromMilliseconds(200),
                        QuicTime::Zero());
   EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), rtt_stats_.latest_rtt());
-  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), rtt_stats_.SmoothedRtt());
+  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), rtt_stats_.smoothed_rtt());
   // Verify that large erroneous ack_delay does not change Smoothed RTT.
   rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(200),
                        QuicTime::Delta::FromMilliseconds(300),
                        QuicTime::Zero());
   EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), rtt_stats_.latest_rtt());
-  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), rtt_stats_.SmoothedRtt());
+  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), rtt_stats_.smoothed_rtt());
 }
 
 TEST_F(RttStatsTest, MinRtt) {
   rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(200),
                        QuicTime::Delta::Zero(),
                        QuicTime::Zero());
-  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), rtt_stats_.MinRtt());
+  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200), rtt_stats_.min_rtt());
   EXPECT_EQ(QuicTime::Delta::FromMilliseconds(200),
             rtt_stats_.recent_min_rtt());
   rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(10),
                        QuicTime::Delta::Zero(),
                        QuicTime::Zero().Add(
                            QuicTime::Delta::FromMilliseconds(10)));
-  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.MinRtt());
+  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt());
   EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.recent_min_rtt());
   rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(50),
                        QuicTime::Delta::Zero(),
                        QuicTime::Zero().Add(
                            QuicTime::Delta::FromMilliseconds(20)));
-  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.MinRtt());
+  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt());
   EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.recent_min_rtt());
   rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(50),
                        QuicTime::Delta::Zero(),
                        QuicTime::Zero().Add(
                            QuicTime::Delta::FromMilliseconds(30)));
-  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.MinRtt());
+  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt());
   EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.recent_min_rtt());
   rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(50),
                        QuicTime::Delta::Zero(),
                        QuicTime::Zero().Add(
                            QuicTime::Delta::FromMilliseconds(40)));
-  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.MinRtt());
+  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt());
   EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.recent_min_rtt());
   // Verify that ack_delay does not go into recording of min_rtt_.
   rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(7),
                        QuicTime::Delta::FromMilliseconds(2),
                        QuicTime::Zero().Add(
                            QuicTime::Delta::FromMilliseconds(50)));
-  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(7), rtt_stats_.MinRtt());
+  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(7), rtt_stats_.min_rtt());
   EXPECT_EQ(QuicTime::Delta::FromMilliseconds(7), rtt_stats_.recent_min_rtt());
 }
 
@@ -108,7 +106,7 @@
   rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(10),
                        QuicTime::Delta::Zero(),
                        QuicTime::Zero());
-  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.MinRtt());
+  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt());
   EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.recent_min_rtt());
 
   rtt_stats_.SampleNewRecentMinRtt(4);
@@ -116,14 +114,14 @@
     rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(50),
                        QuicTime::Delta::Zero(),
                        QuicTime::Zero());
-    EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.MinRtt());
+    EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt());
     EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10),
               rtt_stats_.recent_min_rtt());
   }
   rtt_stats_.UpdateRtt(QuicTime::Delta::FromMilliseconds(50),
                         QuicTime::Delta::Zero(),
                         QuicTime::Zero());
-  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.MinRtt());
+  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt());
   EXPECT_EQ(QuicTime::Delta::FromMilliseconds(50), rtt_stats_.recent_min_rtt());
 }
 
@@ -134,7 +132,7 @@
   QuicTime now = QuicTime::Zero();
   QuicTime::Delta rtt_sample = QuicTime::Delta::FromMilliseconds(10);
   rtt_stats_.UpdateRtt(rtt_sample, QuicTime::Delta::Zero(), now);
-  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.MinRtt());
+  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt());
   EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.recent_min_rtt());
 
   // Gradually increase the rtt samples and ensure the recent_min_rtt starts
@@ -143,7 +141,7 @@
     now = now.Add(QuicTime::Delta::FromMilliseconds(25));
     rtt_sample = rtt_sample.Add(QuicTime::Delta::FromMilliseconds(10));
     rtt_stats_.UpdateRtt(rtt_sample, QuicTime::Delta::Zero(), now);
-    EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.MinRtt());
+    EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt());
     EXPECT_EQ(rtt_sample, RttStatsPeer::GetQuarterWindowRtt(&rtt_stats_));
     EXPECT_EQ(rtt_sample.Subtract(QuicTime::Delta::FromMilliseconds(10)),
               RttStatsPeer::GetHalfWindowRtt(&rtt_stats_));
@@ -165,7 +163,7 @@
   // A new quarter rtt low sets that, but nothing else.
   rtt_sample = rtt_sample.Subtract(QuicTime::Delta::FromMilliseconds(5));
   rtt_stats_.UpdateRtt(rtt_sample, QuicTime::Delta::Zero(), now);
-  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.MinRtt());
+  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt());
   EXPECT_EQ(rtt_sample, RttStatsPeer::GetQuarterWindowRtt(&rtt_stats_));
   EXPECT_EQ(rtt_sample.Subtract(QuicTime::Delta::FromMilliseconds(5)),
             RttStatsPeer::GetHalfWindowRtt(&rtt_stats_));
@@ -175,7 +173,7 @@
   // A new half rtt low sets that and the quarter rtt low.
   rtt_sample = rtt_sample.Subtract(QuicTime::Delta::FromMilliseconds(15));
   rtt_stats_.UpdateRtt(rtt_sample, QuicTime::Delta::Zero(), now);
-  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.MinRtt());
+  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt());
   EXPECT_EQ(rtt_sample, RttStatsPeer::GetQuarterWindowRtt(&rtt_stats_));
   EXPECT_EQ(rtt_sample, RttStatsPeer::GetHalfWindowRtt(&rtt_stats_));
   EXPECT_EQ(QuicTime::Delta::FromMilliseconds(70),
@@ -184,7 +182,7 @@
   // A new full window loss sets the recent_min_rtt, but not min_rtt.
   rtt_sample = QuicTime::Delta::FromMilliseconds(65);
   rtt_stats_.UpdateRtt(rtt_sample, QuicTime::Delta::Zero(), now);
-  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.MinRtt());
+  EXPECT_EQ(QuicTime::Delta::FromMilliseconds(10), rtt_stats_.min_rtt());
   EXPECT_EQ(rtt_sample, RttStatsPeer::GetQuarterWindowRtt(&rtt_stats_));
   EXPECT_EQ(rtt_sample, RttStatsPeer::GetHalfWindowRtt(&rtt_stats_));
   EXPECT_EQ(rtt_sample, rtt_stats_.recent_min_rtt());
@@ -193,7 +191,7 @@
   rtt_sample = QuicTime::Delta::FromMilliseconds(5);
   rtt_stats_.UpdateRtt(rtt_sample, QuicTime::Delta::Zero(), now);
 
-  EXPECT_EQ(rtt_sample, rtt_stats_.MinRtt());
+  EXPECT_EQ(rtt_sample, rtt_stats_.min_rtt());
   EXPECT_EQ(rtt_sample, RttStatsPeer::GetQuarterWindowRtt(&rtt_stats_));
   EXPECT_EQ(rtt_sample, RttStatsPeer::GetHalfWindowRtt(&rtt_stats_));
   EXPECT_EQ(rtt_sample, rtt_stats_.recent_min_rtt());
@@ -202,27 +200,27 @@
 TEST_F(RttStatsTest, ExpireSmoothedMetrics) {
   QuicTime::Delta initial_rtt = QuicTime::Delta::FromMilliseconds(10);
   rtt_stats_.UpdateRtt(initial_rtt, QuicTime::Delta::Zero(), QuicTime::Zero());
-  EXPECT_EQ(initial_rtt, rtt_stats_.MinRtt());
+  EXPECT_EQ(initial_rtt, rtt_stats_.min_rtt());
   EXPECT_EQ(initial_rtt, rtt_stats_.recent_min_rtt());
-  EXPECT_EQ(initial_rtt, rtt_stats_.SmoothedRtt());
+  EXPECT_EQ(initial_rtt, rtt_stats_.smoothed_rtt());
 
   EXPECT_EQ(initial_rtt.Multiply(0.5), rtt_stats_.mean_deviation());
 
   // Update once with a 20ms RTT.
   QuicTime::Delta doubled_rtt = initial_rtt.Multiply(2);
   rtt_stats_.UpdateRtt(doubled_rtt, QuicTime::Delta::Zero(), QuicTime::Zero());
-  EXPECT_EQ(initial_rtt.Multiply(1.125), rtt_stats_.SmoothedRtt());
+  EXPECT_EQ(initial_rtt.Multiply(1.125), rtt_stats_.smoothed_rtt());
 
   // Expire the smoothed metrics, increasing smoothed rtt and mean deviation.
   rtt_stats_.ExpireSmoothedMetrics();
-  EXPECT_EQ(doubled_rtt, rtt_stats_.SmoothedRtt());
+  EXPECT_EQ(doubled_rtt, rtt_stats_.smoothed_rtt());
   EXPECT_EQ(initial_rtt.Multiply(0.875), rtt_stats_.mean_deviation());
 
   // Now go back down to 5ms and expire the smoothed metrics, and ensure the
   // mean deviation increases to 15ms.
   QuicTime::Delta half_rtt = initial_rtt.Multiply(0.5);
   rtt_stats_.UpdateRtt(half_rtt, QuicTime::Delta::Zero(), QuicTime::Zero());
-  EXPECT_GT(doubled_rtt, rtt_stats_.SmoothedRtt());
+  EXPECT_GT(doubled_rtt, rtt_stats_.smoothed_rtt());
   EXPECT_LT(initial_rtt, rtt_stats_.mean_deviation());
 }
 
@@ -232,9 +230,9 @@
 
   QuicTime::Delta initial_rtt = QuicTime::Delta::FromMilliseconds(10);
   rtt_stats_.UpdateRtt(initial_rtt, QuicTime::Delta::Zero(), QuicTime::Zero());
-  EXPECT_EQ(initial_rtt, rtt_stats_.MinRtt());
+  EXPECT_EQ(initial_rtt, rtt_stats_.min_rtt());
   EXPECT_EQ(initial_rtt, rtt_stats_.recent_min_rtt());
-  EXPECT_EQ(initial_rtt, rtt_stats_.SmoothedRtt());
+  EXPECT_EQ(initial_rtt, rtt_stats_.smoothed_rtt());
 
   vector<QuicTime::Delta> bad_send_deltas;
   bad_send_deltas.push_back(QuicTime::Delta::Zero());
@@ -249,9 +247,9 @@
     rtt_stats_.UpdateRtt(bad_send_delta,
                          QuicTime::Delta::Zero(),
                          QuicTime::Zero());
-    EXPECT_EQ(initial_rtt, rtt_stats_.MinRtt());
+    EXPECT_EQ(initial_rtt, rtt_stats_.min_rtt());
     EXPECT_EQ(initial_rtt, rtt_stats_.recent_min_rtt());
-    EXPECT_EQ(initial_rtt, rtt_stats_.SmoothedRtt());
+    EXPECT_EQ(initial_rtt, rtt_stats_.smoothed_rtt());
   }
 }
 
diff --git a/net/quic/congestion_control/tcp_cubic_sender.cc b/net/quic/congestion_control/tcp_cubic_sender.cc
index 44e4b3e..5f20597 100644
--- a/net/quic/congestion_control/tcp_cubic_sender.cc
+++ b/net/quic/congestion_control/tcp_cubic_sender.cc
@@ -22,7 +22,6 @@
 // fast retransmission.  The cwnd after a timeout is still 1.
 const QuicPacketCount kMinimumCongestionWindow = 2;
 const QuicByteCount kMaxSegmentSize = kDefaultTCPMSS;
-const int64 kInitialCongestionWindow = 10;
 const int kMaxBurstLength = 3;
 const float kRenoBeta = 0.7f;  // Reno backoff factor.
 const uint32 kDefaultNumConnections = 2;  // N-connection emulation.
@@ -44,7 +43,7 @@
       largest_sent_sequence_number_(0),
       largest_acked_sequence_number_(0),
       largest_sent_at_last_cutback_(0),
-      congestion_window_(kInitialCongestionWindow),
+      congestion_window_(kDefaultInitialWindow),
       previous_congestion_window_(0),
       slowstart_threshold_(max_tcp_congestion_window),
       previous_slowstart_threshold_(0),
@@ -63,11 +62,13 @@
       // Initial window experiment.  Ignore the initial congestion
       // window suggested by the client and use the default ICWND of
       // 10 instead.
-      congestion_window_ = kInitialCongestionWindow;
+      congestion_window_ = kDefaultInitialWindow;
     } else if (config.HasReceivedInitialCongestionWindow()) {
       // Set the initial window size.
-      congestion_window_ = min(kMaxInitialWindow,
-                               config.ReceivedInitialCongestionWindow());
+      congestion_window_ = max(kMinimumCongestionWindow,
+          min(kMaxInitialWindow,
+              static_cast<QuicPacketCount>(
+                  config.ReceivedInitialCongestionWindow())));
     }
   }
 }
@@ -92,7 +93,7 @@
     const CongestionVector& lost_packets) {
   if (rtt_updated && InSlowStart() &&
       hybrid_slow_start_.ShouldExitSlowStart(rtt_stats_->latest_rtt(),
-                                             rtt_stats_->MinRtt(),
+                                             rtt_stats_->min_rtt(),
                                              congestion_window_)) {
     slowstart_threshold_ = congestion_window_;
   }
@@ -203,27 +204,34 @@
   // We pace at twice the rate of the underlying sender's bandwidth estimate
   // during slow start and 1.25x during congestion avoidance to ensure pacing
   // doesn't prevent us from filling the window.
-  return BandwidthEstimate().Scale(InSlowStart() ? 2 : 1.25);
+  QuicTime::Delta srtt = rtt_stats_->smoothed_rtt();
+  if (srtt.IsZero()) {
+    srtt = QuicTime::Delta::FromMicroseconds(rtt_stats_->initial_rtt_us());
+  }
+  const QuicBandwidth bandwidth =
+      QuicBandwidth::FromBytesAndTimeDelta(GetCongestionWindow(), srtt);
+  return bandwidth.Scale(InSlowStart() ? 2 : 1.25);
 }
 
 QuicBandwidth TcpCubicSender::BandwidthEstimate() const {
-  if (rtt_stats_->SmoothedRtt().IsZero()) {
-    LOG(DFATAL) << "In BandwidthEstimate(), smoothed RTT is zero!";
+  QuicTime::Delta srtt = rtt_stats_->smoothed_rtt();
+  if (srtt.IsZero()) {
+    // If we haven't measured an rtt, the bandwidth estimate is unknown.
     return QuicBandwidth::Zero();
   }
-  return QuicBandwidth::FromBytesAndTimeDelta(GetCongestionWindow(),
-                                              rtt_stats_->SmoothedRtt());
+  return QuicBandwidth::FromBytesAndTimeDelta(GetCongestionWindow(), srtt);
 }
 
 bool TcpCubicSender::HasReliableBandwidthEstimate() const {
-  return !InSlowStart() && !InRecovery();
+  return !InSlowStart() && !InRecovery() &&
+      !rtt_stats_->smoothed_rtt().IsZero();;
 }
 
 QuicTime::Delta TcpCubicSender::RetransmissionDelay() const {
-  if (!rtt_stats_->HasUpdates()) {
+  if (rtt_stats_->smoothed_rtt().IsZero()) {
     return QuicTime::Delta::Zero();
   }
-  return rtt_stats_->SmoothedRtt().Add(
+  return rtt_stats_->smoothed_rtt().Add(
       rtt_stats_->mean_deviation().Multiply(4));
 }
 
@@ -299,7 +307,7 @@
   } else {
     congestion_window_ = min(max_tcp_congestion_window_,
                              cubic_.CongestionWindowAfterAck(
-                                 congestion_window_, rtt_stats_->MinRtt()));
+                                 congestion_window_, rtt_stats_->min_rtt()));
     DVLOG(1) << "Cubic; congestion window: " << congestion_window_
              << " slowstart threshold: " << slowstart_threshold_;
   }
diff --git a/net/quic/congestion_control/tcp_cubic_sender_test.cc b/net/quic/congestion_control/tcp_cubic_sender_test.cc
index 4fe8dbf..48a1300 100644
--- a/net/quic/congestion_control/tcp_cubic_sender_test.cc
+++ b/net/quic/congestion_control/tcp_cubic_sender_test.cc
@@ -21,8 +21,7 @@
 namespace net {
 namespace test {
 
-const int64 kInitialCongestionWindow = 10;
-const uint32 kDefaultWindowTCP = kInitialCongestionWindow * kDefaultTCPMSS;
+const uint32 kDefaultWindowTCP = kDefaultInitialWindow * kDefaultTCPMSS;
 const float kRenoBeta = 0.7f;  // Reno backoff factor.
 
 // TODO(ianswett): Remove 10000 once b/10075719 is fixed.
@@ -188,6 +187,8 @@
   EXPECT_TRUE(sender_->TimeUntilSend(clock_.Now(),
       0,
       HAS_RETRANSMITTABLE_DATA).IsZero());
+  EXPECT_FALSE(sender_->HasReliableBandwidthEstimate());
+  EXPECT_EQ(QuicBandwidth::Zero(), sender_->BandwidthEstimate());
   // Make sure we can send.
   EXPECT_TRUE(sender_->TimeUntilSend(clock_.Now(),
                                      0,
@@ -198,9 +199,12 @@
     SendAvailableSendWindow();
     AckNPackets(2);
   }
-  QuicByteCount bytes_to_send = sender_->GetCongestionWindow();
-  EXPECT_EQ(kDefaultWindowTCP + kDefaultTCPMSS * 2 * kNumberOfAcks,
-            bytes_to_send);
+  const QuicByteCount cwnd = sender_->GetCongestionWindow();
+  EXPECT_EQ(kDefaultWindowTCP + kDefaultTCPMSS * 2 * kNumberOfAcks, cwnd);
+  EXPECT_FALSE(sender_->HasReliableBandwidthEstimate());
+  EXPECT_EQ(QuicBandwidth::FromBytesAndTimeDelta(
+                cwnd, sender_->rtt_stats_.smoothed_rtt()),
+            sender_->BandwidthEstimate());
 }
 
 TEST_F(TcpCubicSenderTest, SlowStartAckTrain) {
@@ -301,7 +305,7 @@
 
 TEST_F(TcpCubicSenderTest, NoPRRWhenLessThanOnePacketInFlight) {
   SendAvailableSendWindow();
-  LoseNPackets(kInitialCongestionWindow - 1);
+  LoseNPackets(kDefaultInitialWindow - 1);
   AckNPackets(1);
   // PRR will allow 2 packets for every ack during recovery.
   EXPECT_EQ(2, SendAvailableSendWindow());
@@ -469,13 +473,13 @@
   }
   expected_delay = QuicTime::Delta::FromMilliseconds(kRttMs + kDeviationMs * 4);
 
-  EXPECT_NEAR(kRttMs, sender_->rtt_stats_.SmoothedRtt().ToMilliseconds(), 1);
+  EXPECT_NEAR(kRttMs, sender_->rtt_stats_.smoothed_rtt().ToMilliseconds(), 1);
   EXPECT_NEAR(expected_delay.ToMilliseconds(),
               sender_->RetransmissionDelay().ToMilliseconds(),
               1);
   EXPECT_EQ(static_cast<int64>(
                 sender_->GetCongestionWindow() * kNumMicrosPerSecond /
-                sender_->rtt_stats_.SmoothedRtt().ToMicroseconds()),
+                sender_->rtt_stats_.smoothed_rtt().ToMicroseconds()),
             sender_->BandwidthEstimate().ToBytesPerSecond());
 }
 
diff --git a/net/quic/congestion_control/tcp_loss_algorithm.cc b/net/quic/congestion_control/tcp_loss_algorithm.cc
index e609122..6cf56d8 100644
--- a/net/quic/congestion_control/tcp_loss_algorithm.cc
+++ b/net/quic/congestion_control/tcp_loss_algorithm.cc
@@ -31,7 +31,7 @@
   SequenceNumberSet lost_packets;
   loss_detection_timeout_ = QuicTime::Zero();
   QuicTime::Delta loss_delay =
-      rtt_stats.SmoothedRtt().Multiply(kEarlyRetransmitLossDelayMultiplier);
+      rtt_stats.smoothed_rtt().Multiply(kEarlyRetransmitLossDelayMultiplier);
   QuicPacketSequenceNumber sequence_number = unacked_packets.GetLeastUnacked();
   for (QuicUnackedPacketMap::const_iterator it = unacked_packets.begin();
        it != unacked_packets.end() && sequence_number <= largest_observed;
diff --git a/net/quic/congestion_control/tcp_loss_algorithm_test.cc b/net/quic/congestion_control/tcp_loss_algorithm_test.cc
index 34bcc16..5819fb1 100644
--- a/net/quic/congestion_control/tcp_loss_algorithm_test.cc
+++ b/net/quic/congestion_control/tcp_loss_algorithm_test.cc
@@ -118,7 +118,7 @@
   unacked_packets_.RemoveFromInFlight(2);
   unacked_packets_.NackPacket(1, 1);
   VerifyLosses(2, nullptr, 0);
-  EXPECT_EQ(clock_.Now().Add(rtt_stats_.SmoothedRtt().Multiply(1.25)),
+  EXPECT_EQ(clock_.Now().Add(rtt_stats_.smoothed_rtt().Multiply(1.25)),
             loss_algorithm_.GetLossTimeout());
 
   clock_.AdvanceTime(rtt_stats_.latest_rtt().Multiply(1.25));
@@ -133,7 +133,7 @@
     SendDataPacket(i);
     // Advance the time 1/4 RTT between 3 and 4.
     if (i == 3) {
-      clock_.AdvanceTime(rtt_stats_.SmoothedRtt().Multiply(0.25));
+      clock_.AdvanceTime(rtt_stats_.smoothed_rtt().Multiply(0.25));
     }
   }
 
@@ -148,15 +148,15 @@
   VerifyLosses(kNumSentPackets, lost, arraysize(lost));
   // The time has already advanced 1/4 an RTT, so ensure the timeout is set
   // 1.25 RTTs after the earliest pending packet(3), not the last(4).
-  EXPECT_EQ(clock_.Now().Add(rtt_stats_.SmoothedRtt()),
+  EXPECT_EQ(clock_.Now().Add(rtt_stats_.smoothed_rtt()),
             loss_algorithm_.GetLossTimeout());
 
-  clock_.AdvanceTime(rtt_stats_.SmoothedRtt());
+  clock_.AdvanceTime(rtt_stats_.smoothed_rtt());
   QuicPacketSequenceNumber lost2[] = { 1, 2, 3 };
   VerifyLosses(kNumSentPackets, lost2, arraysize(lost2));
-  EXPECT_EQ(clock_.Now().Add(rtt_stats_.SmoothedRtt().Multiply(0.25)),
+  EXPECT_EQ(clock_.Now().Add(rtt_stats_.smoothed_rtt().Multiply(0.25)),
             loss_algorithm_.GetLossTimeout());
-  clock_.AdvanceTime(rtt_stats_.SmoothedRtt().Multiply(0.25));
+  clock_.AdvanceTime(rtt_stats_.smoothed_rtt().Multiply(0.25));
   QuicPacketSequenceNumber lost3[] = { 1, 2, 3, 4 };
   VerifyLosses(kNumSentPackets, lost3, arraysize(lost3));
   EXPECT_EQ(QuicTime::Zero(), loss_algorithm_.GetLossTimeout());
diff --git a/net/quic/congestion_control/time_loss_algorithm.cc b/net/quic/congestion_control/time_loss_algorithm.cc
index 3a7b42d..9dd9ae9 100644
--- a/net/quic/congestion_control/time_loss_algorithm.cc
+++ b/net/quic/congestion_control/time_loss_algorithm.cc
@@ -36,7 +36,7 @@
   loss_detection_timeout_ = QuicTime::Zero();
   QuicTime::Delta loss_delay = QuicTime::Delta::Max(
       QuicTime::Delta::FromMilliseconds(kMinLossDelayMs),
-      QuicTime::Delta::Max(rtt_stats.SmoothedRtt(), rtt_stats.latest_rtt())
+      QuicTime::Delta::Max(rtt_stats.smoothed_rtt(), rtt_stats.latest_rtt())
           .Multiply(kLossDelayMultiplier));
 
   QuicPacketSequenceNumber sequence_number = unacked_packets.GetLeastUnacked();
diff --git a/net/quic/congestion_control/time_loss_algorithm_test.cc b/net/quic/congestion_control/time_loss_algorithm_test.cc
index 374e563..b964d28 100644
--- a/net/quic/congestion_control/time_loss_algorithm_test.cc
+++ b/net/quic/congestion_control/time_loss_algorithm_test.cc
@@ -60,7 +60,7 @@
     unacked_packets_.NackPacket(1, i);
     VerifyLosses(2, nullptr, 0);
   }
-  EXPECT_EQ(rtt_stats_.SmoothedRtt().Multiply(1.25),
+  EXPECT_EQ(rtt_stats_.smoothed_rtt().Multiply(1.25),
             loss_algorithm_.GetLossTimeout().Subtract(clock_.Now()));
 }
 
@@ -69,7 +69,7 @@
   // Transmit 10 packets at 1/10th an RTT interval.
   for (size_t i = 1; i <= kNumSentPackets; ++i) {
     SendDataPacket(i);
-    clock_.AdvanceTime(rtt_stats_.SmoothedRtt().Multiply(0.1));
+    clock_.AdvanceTime(rtt_stats_.smoothed_rtt().Multiply(0.1));
   }
   // Expect the timer to not be set.
   EXPECT_EQ(QuicTime::Zero(), loss_algorithm_.GetLossTimeout());
@@ -78,11 +78,11 @@
   unacked_packets_.RemoveFromInFlight(2);
   VerifyLosses(2, nullptr, 0);
   // Expect the timer to be set to 0.25 RTT's in the future.
-  EXPECT_EQ(rtt_stats_.SmoothedRtt().Multiply(0.25),
+  EXPECT_EQ(rtt_stats_.smoothed_rtt().Multiply(0.25),
             loss_algorithm_.GetLossTimeout().Subtract(clock_.Now()));
   unacked_packets_.NackPacket(1, 5);
   VerifyLosses(2, nullptr, 0);
-  clock_.AdvanceTime(rtt_stats_.SmoothedRtt().Multiply(0.25));
+  clock_.AdvanceTime(rtt_stats_.smoothed_rtt().Multiply(0.25));
   QuicPacketSequenceNumber lost[] = { 1 };
   VerifyLosses(2, lost, arraysize(lost));
   EXPECT_EQ(QuicTime::Zero(), loss_algorithm_.GetLossTimeout());
@@ -93,7 +93,7 @@
   // Transmit 10 packets at 1/10th an RTT interval.
   for (size_t i = 1; i <= kNumSentPackets; ++i) {
     SendDataPacket(i);
-    clock_.AdvanceTime(rtt_stats_.SmoothedRtt().Multiply(0.1));
+    clock_.AdvanceTime(rtt_stats_.smoothed_rtt().Multiply(0.1));
   }
   // Expect the timer to not be set.
   EXPECT_EQ(QuicTime::Zero(), loss_algorithm_.GetLossTimeout());
@@ -102,9 +102,9 @@
   VerifyLosses(1, nullptr, 0);
   // The timer should still not be set.
   EXPECT_EQ(QuicTime::Zero(), loss_algorithm_.GetLossTimeout());
-  clock_.AdvanceTime(rtt_stats_.SmoothedRtt().Multiply(0.25));
+  clock_.AdvanceTime(rtt_stats_.smoothed_rtt().Multiply(0.25));
   VerifyLosses(1, nullptr, 0);
-  clock_.AdvanceTime(rtt_stats_.SmoothedRtt());
+  clock_.AdvanceTime(rtt_stats_.smoothed_rtt());
   VerifyLosses(1, nullptr, 0);
 
   EXPECT_EQ(QuicTime::Zero(), loss_algorithm_.GetLossTimeout());
@@ -116,7 +116,7 @@
   for (size_t i = 1; i <= kNumSentPackets; ++i) {
     SendDataPacket(i);
   }
-  clock_.AdvanceTime(rtt_stats_.SmoothedRtt());
+  clock_.AdvanceTime(rtt_stats_.smoothed_rtt());
   // Expect the timer to not be set.
   EXPECT_EQ(QuicTime::Zero(), loss_algorithm_.GetLossTimeout());
   // The packet should not be lost until 1.25 RTTs pass.
@@ -126,9 +126,9 @@
   unacked_packets_.RemoveFromInFlight(10);
   VerifyLosses(10, nullptr, 0);
   // Expect the timer to be set to 0.25 RTT's in the future.
-  EXPECT_EQ(rtt_stats_.SmoothedRtt().Multiply(0.25),
+  EXPECT_EQ(rtt_stats_.smoothed_rtt().Multiply(0.25),
             loss_algorithm_.GetLossTimeout().Subtract(clock_.Now()));
-  clock_.AdvanceTime(rtt_stats_.SmoothedRtt().Multiply(0.25));
+  clock_.AdvanceTime(rtt_stats_.smoothed_rtt().Multiply(0.25));
   QuicPacketSequenceNumber lost[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
   VerifyLosses(10, lost, arraysize(lost));
   EXPECT_EQ(QuicTime::Zero(), loss_algorithm_.GetLossTimeout());
diff --git a/net/quic/crypto/quic_crypto_server_config.cc b/net/quic/crypto/quic_crypto_server_config.cc
index a5c5d08..5a650b6 100644
--- a/net/quic/crypto/quic_crypto_server_config.cc
+++ b/net/quic/crypto/quic_crypto_server_config.cc
@@ -1420,6 +1420,10 @@
       rand, source_address_token.SerializeAsString());
 }
 
+bool QuicCryptoServerConfig::HasProofSource() const {
+  return proof_source_ != nullptr;
+}
+
 HandshakeFailureReason QuicCryptoServerConfig::ValidateSourceAddressToken(
     const Config& config,
     StringPiece token,
diff --git a/net/quic/crypto/quic_crypto_server_config.h b/net/quic/crypto/quic_crypto_server_config.h
index 30e0f6d..dbbff1a 100644
--- a/net/quic/crypto/quic_crypto_server_config.h
+++ b/net/quic/crypto/quic_crypto_server_config.h
@@ -326,6 +326,9 @@
   // Set and take ownership of the callback to invoke on primary config changes.
   void AcquirePrimaryConfigChangedCb(PrimaryConfigChangedCallback* cb);
 
+  // Returns true if this config has a |proof_source_|.
+  bool HasProofSource() const;
+
  private:
   friend class test::QuicCryptoServerConfigPeer;
 
diff --git a/net/quic/quic_client_session.cc b/net/quic/quic_client_session.cc
index a12b1d0..7c220ad 100644
--- a/net/quic/quic_client_session.cc
+++ b/net/quic/quic_client_session.cc
@@ -155,9 +155,10 @@
     TransportSecurityState* transport_security_state,
     scoped_ptr<QuicServerInfo> server_info,
     const QuicConfig& config,
+    bool is_secure,
     base::TaskRunner* task_runner,
     NetLog* net_log)
-    : QuicClientSessionBase(connection, config),
+    : QuicClientSessionBase(connection, config, is_secure),
       require_confirmation_(false),
       stream_factory_(stream_factory),
       socket_(socket.Pass()),
diff --git a/net/quic/quic_client_session.h b/net/quic/quic_client_session.h
index b1a35d9..6c33eb5 100644
--- a/net/quic/quic_client_session.h
+++ b/net/quic/quic_client_session.h
@@ -96,6 +96,7 @@
                     TransportSecurityState* transport_security_state,
                     scoped_ptr<QuicServerInfo> server_info,
                     const QuicConfig& config,
+                    bool is_secure,
                     base::TaskRunner* task_runner,
                     NetLog* net_log);
   ~QuicClientSession() override;
diff --git a/net/quic/quic_client_session_base.cc b/net/quic/quic_client_session_base.cc
index 40d4b86..5b5902b 100644
--- a/net/quic/quic_client_session_base.cc
+++ b/net/quic/quic_client_session_base.cc
@@ -10,8 +10,9 @@
 
 QuicClientSessionBase::QuicClientSessionBase(
     QuicConnection* connection,
-    const QuicConfig& config)
-    : QuicSession(connection, config) {}
+    const QuicConfig& config,
+    bool is_secure)
+    : QuicSession(connection, config, is_secure) {}
 
 QuicClientSessionBase::~QuicClientSessionBase() {}
 
diff --git a/net/quic/quic_client_session_base.h b/net/quic/quic_client_session_base.h
index d72996c..a7f64fb 100644
--- a/net/quic/quic_client_session_base.h
+++ b/net/quic/quic_client_session_base.h
@@ -14,7 +14,8 @@
 class NET_EXPORT_PRIVATE QuicClientSessionBase : public QuicSession {
  public:
   QuicClientSessionBase(QuicConnection* connection,
-                        const QuicConfig& config);
+                        const QuicConfig& config,
+                        bool is_secure);
 
   ~QuicClientSessionBase() override;
 
diff --git a/net/quic/quic_client_session_test.cc b/net/quic/quic_client_session_test.cc
index cae2220..8860f2e 100644
--- a/net/quic/quic_client_session_test.cc
+++ b/net/quic/quic_client_session_test.cc
@@ -46,11 +46,13 @@
         session_(connection_, GetSocket().Pass(), nullptr,
                  &transport_security_state_,
                  make_scoped_ptr((QuicServerInfo*)nullptr), DefaultQuicConfig(),
+                 /*is_secure=*/false,
                  base::MessageLoop::current()->message_loop_proxy().get(),
                  &net_log_) {
-    session_.InitializeSession(QuicServerId(kServerHostname, kServerPort, false,
+    session_.InitializeSession(QuicServerId(kServerHostname, kServerPort,
+                                            /*is_secure=*/false,
                                             PRIVACY_MODE_DISABLED),
-                                &crypto_config_, nullptr);
+        &crypto_config_, nullptr);
   }
 
   void TearDown() override { session_.CloseSessionOnError(ERR_ABORTED); }
diff --git a/net/quic/quic_connection.cc b/net/quic/quic_connection.cc
index 21ea41a..6308d88 100644
--- a/net/quic/quic_connection.cc
+++ b/net/quic/quic_connection.cc
@@ -1139,13 +1139,11 @@
 const QuicConnectionStats& QuicConnection::GetStats() {
   // Update rtt and estimated bandwidth.
   stats_.min_rtt_us =
-      sent_packet_manager_.GetRttStats()->MinRtt().ToMicroseconds();
+      sent_packet_manager_.GetRttStats()->min_rtt().ToMicroseconds();
   stats_.srtt_us =
-      sent_packet_manager_.GetRttStats()->SmoothedRtt().ToMicroseconds();
+      sent_packet_manager_.GetRttStats()->smoothed_rtt().ToMicroseconds();
   stats_.estimated_bandwidth =
       sent_packet_manager_.BandwidthEstimate().ToBytesPerSecond();
-  stats_.congestion_window = sent_packet_manager_.GetCongestionWindow();
-  stats_.slow_start_threshold = sent_packet_manager_.GetSlowStartThreshold();
   stats_.max_packet_size = packet_generator_.max_packet_length();
   return stats_;
 }
@@ -1276,7 +1274,7 @@
 
   if (is_server_ && encryption_level_ == ENCRYPTION_NONE &&
       last_size_ > packet_generator_.max_packet_length()) {
-    packet_generator_.set_max_packet_length(last_size_);
+    set_max_packet_length(last_size_);
   }
   return true;
 }
@@ -1496,7 +1494,7 @@
   // perhaps via the NetworkChangeVisitor.
   packet_generator_.UpdateSequenceNumberLength(
       sent_packet_manager_.least_packet_awaited_by_peer(),
-      sent_packet_manager_.GetCongestionWindow());
+      sent_packet_manager_.EstimateMaxPacketsInFlight(max_packet_length()));
 
   bool reset_retransmission_alarm = sent_packet_manager_.OnPacketSent(
       &packet->serialized_packet,
@@ -1586,7 +1584,7 @@
 
 void QuicConnection::OnCongestionWindowChange() {
   packet_generator_.OnCongestionWindowChange(
-      sent_packet_manager_.GetCongestionWindow());
+      sent_packet_manager_.EstimateMaxPacketsInFlight(max_packet_length()));
   visitor_->OnCongestionWindowChange(clock_->ApproximateNow());
 }
 
@@ -1686,7 +1684,8 @@
         // 3 times the current congestion window (in slow start) should cover
         // about two full round trips worth of packets, which should be
         // sufficient.
-        3 * sent_packet_manager_.GetCongestionWindow() / max_packet_length();
+        3 * sent_packet_manager_.EstimateMaxPacketsInFlight(
+            max_packet_length());
   }
 }
 
@@ -1940,11 +1939,7 @@
 
   if (timeout < idle_network_timeout_) {
     idle_network_timeout_ = timeout;
-    if (FLAGS_quic_timeouts_only_from_alarms) {
-      SetTimeoutAlarm();
-    } else {
-      CheckForTimeout();
-    }
+    SetTimeoutAlarm();
   } else {
     idle_network_timeout_ = timeout;
   }
@@ -1953,11 +1948,7 @@
 void QuicConnection::SetOverallConnectionTimeout(QuicTime::Delta timeout) {
   if (timeout < overall_connection_timeout_) {
     overall_connection_timeout_ = timeout;
-    if (FLAGS_quic_timeouts_only_from_alarms) {
-      SetTimeoutAlarm();
-    } else {
-      CheckForTimeout();
-    }
+    SetTimeoutAlarm();
   } else {
     overall_connection_timeout_ = timeout;
   }
diff --git a/net/quic/quic_connection.h b/net/quic/quic_connection.h
index 7a9e55d..f9f8733 100644
--- a/net/quic/quic_connection.h
+++ b/net/quic/quic_connection.h
@@ -431,14 +431,11 @@
   void SetIdleNetworkTimeout(QuicTime::Delta timeout);
 
   // Sets (or resets) the total time delta the connection can be alive for.
-  // Also, checks and times out the connection if timer has expired for
-  // |timeout|. Used to limit the time a connection can be alive before crypto
-  // handshake finishes.
+  // Used to limit the time a connection can be alive before crypto handshake
+  // finishes.
   void SetOverallConnectionTimeout(QuicTime::Delta timeout);
 
   // Sets the overall and idle state connection timeouts.
-  // Times out the connection if the timeout has been reached and
-  // the quic_timeouts_only_from_alarms flag is false.
   void SetNetworkTimeouts(QuicTime::Delta overall_timeout,
                           QuicTime::Delta idle_timeout);
 
diff --git a/net/quic/quic_connection_stats.cc b/net/quic/quic_connection_stats.cc
index 7081d0d..6625c61 100644
--- a/net/quic/quic_connection_stats.cc
+++ b/net/quic/quic_connection_stats.cc
@@ -34,8 +34,6 @@
       srtt_us(0),
       max_packet_size(0),
       estimated_bandwidth(0),
-      congestion_window(0),
-      slow_start_threshold(0),
       packets_reordered(0),
       max_sequence_reordering(0),
       max_time_reordering_us(0),
@@ -73,8 +71,6 @@
      << ", srtt(us): " << s.srtt_us
      << ", max packet size: " << s.max_packet_size
      << ", estimated bandwidth: " << s.estimated_bandwidth
-     << ", congestion window: " << s.congestion_window
-     << ", slow start threshold: " << s.slow_start_threshold
      << ", tcp_loss_events: " << s.tcp_loss_events
      << ", packets reordered: " << s.packets_reordered
      << ", max sequence reordering: " << s.max_sequence_reordering
diff --git a/net/quic/quic_connection_stats.h b/net/quic/quic_connection_stats.h
index c681dea..2abdb59 100644
--- a/net/quic/quic_connection_stats.h
+++ b/net/quic/quic_connection_stats.h
@@ -55,8 +55,6 @@
   int64 srtt_us;  // Smoothed RTT in microseconds.
   uint32 max_packet_size;  // In bytes.
   uint64 estimated_bandwidth;  // In bytes per second.
-  uint32 congestion_window;  // In bytes
-  uint32 slow_start_threshold;  // In bytes
 
   // Reordering stats for received packets.
   // Number of packets received out of sequence number order.
diff --git a/net/quic/quic_connection_test.cc b/net/quic/quic_connection_test.cc
index b230fd5..66cb89c 100644
--- a/net/quic/quic_connection_test.cc
+++ b/net/quic/quic_connection_test.cc
@@ -3676,10 +3676,6 @@
   EXPECT_CALL(*send_algorithm_, BandwidthEstimate()).WillOnce(
       Return(QuicBandwidth::Zero()));
 
-  const uint32 kSlowStartThreshold = 23u;
-  EXPECT_CALL(*send_algorithm_, GetSlowStartThreshold()).WillOnce(
-      Return(kSlowStartThreshold));
-
   const QuicConnectionStats& stats = connection_.GetStats();
   EXPECT_EQ(3 * first_packet_size + 2 * second_packet_size - kQuicVersionSize,
             stats.bytes_sent);
@@ -3688,8 +3684,6 @@
             stats.bytes_retransmitted);
   EXPECT_EQ(3u, stats.packets_retransmitted);
   EXPECT_EQ(1u, stats.rto_count);
-  EXPECT_EQ(kMaxPacketSize, stats.congestion_window);
-  EXPECT_EQ(kSlowStartThreshold, stats.slow_start_threshold);
   EXPECT_EQ(kDefaultMaxPacketSize, stats.max_packet_size);
 }
 
@@ -3705,9 +3699,6 @@
 
   EXPECT_CALL(*send_algorithm_, BandwidthEstimate()).WillOnce(
       Return(QuicBandwidth::Zero()));
-  const uint32 kSlowStartThreshold = 23u;
-  EXPECT_CALL(*send_algorithm_, GetSlowStartThreshold()).WillOnce(
-      Return(kSlowStartThreshold));
 
   const QuicConnectionStats& stats = connection_.GetStats();
   EXPECT_EQ(received_bytes, stats.bytes_received);
@@ -3715,8 +3706,6 @@
 
   EXPECT_EQ(1u, stats.packets_revived);
   EXPECT_EQ(1u, stats.packets_dropped);
-
-  EXPECT_EQ(kSlowStartThreshold, stats.slow_start_threshold);
 }
 
 TEST_P(QuicConnectionTest, TestFecGroupLimits) {
diff --git a/net/quic/quic_dispatcher.cc b/net/quic/quic_dispatcher.cc
index cbdd540..aede7c2 100644
--- a/net/quic/quic_dispatcher.cc
+++ b/net/quic/quic_dispatcher.cc
@@ -352,7 +352,8 @@
   QuicServerSession* session = new QuicServerSession(
       config_,
       CreateQuicConnection(connection_id, server_address, client_address),
-      this);
+      this,
+      crypto_config_.HasProofSource());
   session->InitializeSession(crypto_config_);
   return session;
 }
diff --git a/net/quic/quic_flags.cc b/net/quic/quic_flags.cc
index 682e06e..8d6dd86 100644
--- a/net/quic/quic_flags.cc
+++ b/net/quic/quic_flags.cc
@@ -36,10 +36,6 @@
 // limit.
 bool FLAGS_quic_allow_more_open_streams = false;
 
-// If true, then QUIC connections will only timeout when an alarm fires, never
-// when setting a timeout.
-bool FLAGS_quic_timeouts_only_from_alarms = true;
-
 // If true, then QUIC connections will set both idle and overall timeouts in a
 // single method.
 bool FLAGS_quic_unified_timeouts = true;
diff --git a/net/quic/quic_flags.h b/net/quic/quic_flags.h
index 271b02e..d49f47a 100644
--- a/net/quic/quic_flags.h
+++ b/net/quic/quic_flags.h
@@ -15,7 +15,6 @@
 NET_EXPORT_PRIVATE extern bool FLAGS_enable_quic_fec;
 NET_EXPORT_PRIVATE extern bool FLAGS_quic_use_bbr_congestion_control;
 NET_EXPORT_PRIVATE extern bool FLAGS_quic_allow_more_open_streams;
-NET_EXPORT_PRIVATE extern bool FLAGS_quic_timeouts_only_from_alarms;
 NET_EXPORT_PRIVATE extern bool FLAGS_quic_unified_timeouts;
 NET_EXPORT_PRIVATE extern bool FLAGS_quic_drop_junk_packets;
 NET_EXPORT_PRIVATE extern bool FLAGS_quic_allow_bbr;
diff --git a/net/quic/quic_http_stream_test.cc b/net/quic/quic_http_stream_test.cc
index 53be4dd..db97aac 100644
--- a/net/quic/quic_http_stream_test.cc
+++ b/net/quic/quic_http_stream_test.cc
@@ -232,11 +232,13 @@
                               &transport_security_state_,
                               make_scoped_ptr((QuicServerInfo*)nullptr),
                               DefaultQuicConfig(),
+                              /*is_secure=*/false,
                               base::MessageLoop::current()->
                                   message_loop_proxy().get(),
                               nullptr));
     session_->InitializeSession(QuicServerId(kServerHostname, kServerPort,
-                                             false, PRIVACY_MODE_DISABLED),
+                                             /*is_secure=*/false,
+                                             PRIVACY_MODE_DISABLED),
                                 &crypto_config_,
                                 &crypto_client_stream_factory_);
     session_->GetCryptoStream()->CryptoConnect();
@@ -285,7 +287,7 @@
       QuicPacketSequenceNumber sequence_number) {
     return maker_.MakeRstPacket(
         sequence_number, true, stream_id_,
-        AdjustErrorForVersion(QUIC_RST_FLOW_CONTROL_ACCOUNTING, GetParam()));
+        AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, GetParam()));
   }
 
   scoped_ptr<QuicEncryptedPacket> ConstructAckAndRstStreamPacket(
diff --git a/net/quic/quic_network_transaction_unittest.cc b/net/quic/quic_network_transaction_unittest.cc
index ab698f3..62fe895 100644
--- a/net/quic/quic_network_transaction_unittest.cc
+++ b/net/quic/quic_network_transaction_unittest.cc
@@ -286,7 +286,7 @@
     const AlternateProtocolInfo alternate =
         session_->http_server_properties()->GetAlternateProtocol(
             HostPortPair::FromURL(request_.url));
-    EXPECT_EQ(ALTERNATE_PROTOCOL_BROKEN, alternate.protocol);
+    EXPECT_TRUE(alternate.is_broken);
   }
 
   void ExpectQuicAlternateProtocolMapping() {
diff --git a/net/quic/quic_packet_creator.cc b/net/quic/quic_packet_creator.cc
index c1700c0..866f05f 100644
--- a/net/quic/quic_packet_creator.cc
+++ b/net/quic/quic_packet_creator.cc
@@ -187,16 +187,14 @@
 
 void QuicPacketCreator::UpdateSequenceNumberLength(
       QuicPacketSequenceNumber least_packet_awaited_by_peer,
-      QuicByteCount congestion_window) {
+      QuicPacketCount max_packets_in_flight) {
   DCHECK_LE(least_packet_awaited_by_peer, sequence_number_ + 1);
   // Since the packet creator will not change sequence number length mid FEC
   // group, include the size of an FEC group to be safe.
   const QuicPacketSequenceNumber current_delta =
       max_packets_per_fec_group_ + sequence_number_ + 1
       - least_packet_awaited_by_peer;
-  const uint64 congestion_window_packets =
-      congestion_window / max_packet_length_;
-  const uint64 delta = max(current_delta, congestion_window_packets);
+  const uint64 delta = max(current_delta, max_packets_in_flight);
   next_sequence_number_length_ =
       QuicFramer::GetMinSequenceNumberLength(delta * 4);
 }
@@ -505,16 +503,31 @@
 }
 
 void QuicPacketCreator::MaybeAddPadding() {
-  if (queued_retransmittable_frames_.get() == nullptr) {
-    return;
-  }
-  if (!queued_retransmittable_frames_->HasCryptoHandshake()) {
-    return;
-  }
   if (BytesFree() == 0) {
     // Don't pad full packets.
     return;
   }
+
+  // Since ReserializeAllFrames does not populate queued_retransmittable_frames_
+  // it's not sufficient to simply call
+  // queued_retransmittable_frames_->HasCryptoHandshake().
+  // TODO(rch): we should really make ReserializeAllFrames not be a special
+  // case!
+
+  // If any of the frames in the current packet are on the crypto stream
+  // then they contain handshake messagses, and we should pad them.
+  bool is_handshake = false;
+  for (const QuicFrame& frame : queued_frames_) {
+    if (frame.type == STREAM_FRAME &&
+        frame.stream_frame->stream_id == kCryptoStreamId) {
+      is_handshake = true;
+      break;
+    }
+  }
+  if (!is_handshake) {
+    return;
+  }
+
   QuicPaddingFrame padding;
   bool success = AddFrame(QuicFrame(&padding), false);
   DCHECK(success);
diff --git a/net/quic/quic_packet_creator.h b/net/quic/quic_packet_creator.h
index 1ca8b09..287cde1 100644
--- a/net/quic/quic_packet_creator.h
+++ b/net/quic/quic_packet_creator.h
@@ -65,7 +65,7 @@
   // can be safely changed.
   void UpdateSequenceNumberLength(
       QuicPacketSequenceNumber least_packet_awaited_by_peer,
-      QuicByteCount congestion_window);
+      QuicPacketCount max_packets_in_flight);
 
   // The overhead the framing will add for a packet with one frame.
   static size_t StreamFramePacketOverhead(
diff --git a/net/quic/quic_packet_creator_test.cc b/net/quic/quic_packet_creator_test.cc
index 08acdc7..4e03e3a 100644
--- a/net/quic/quic_packet_creator_test.cc
+++ b/net/quic/quic_packet_creator_test.cc
@@ -466,6 +466,52 @@
   delete serialized.packet;
 }
 
+TEST_P(QuicPacketCreatorTest, ReserializeFramesWithPadding) {
+  scoped_ptr<QuicStreamFrame> stream_frame(
+      new QuicStreamFrame(kCryptoStreamId, /*fin=*/ false, /*offset=*/ 0,
+                          MakeIOVector("fake handshake message data")));
+  frames_.push_back(QuicFrame(stream_frame.get()));
+  SerializedPacket serialized =
+      creator_.ReserializeAllFrames(frames_,
+                                    creator_.next_sequence_number_length());
+
+  EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize),
+            serialized.packet->length());
+  delete serialized.packet;
+}
+
+TEST_P(QuicPacketCreatorTest, ReserializeFramesWithFullPacketAndPadding) {
+  const size_t overhead = GetPacketHeaderOverhead(NOT_IN_FEC_GROUP)
+      + GetEncryptionOverhead() + GetStreamFrameOverhead(NOT_IN_FEC_GROUP);
+  size_t capacity = kDefaultMaxPacketSize - overhead;
+  for (int delta = -5; delta <= 0; ++delta) {
+    string data(capacity + delta, 'A');
+    size_t bytes_free = 0 - delta;
+
+    scoped_ptr<QuicStreamFrame> stream_frame(
+        new QuicStreamFrame(kCryptoStreamId, /*fin=*/ false, kOffset,
+                            MakeIOVector(data)));
+    frames_.push_back(QuicFrame(stream_frame.get()));
+    SerializedPacket serialized =
+        creator_.ReserializeAllFrames(frames_,
+                                      creator_.next_sequence_number_length());
+
+    // If there is not enough space in the packet to fit a padding frame
+    // (1 byte) and to expand the stream frame (another 2 bytes) the packet
+    // will not be padded.
+    if (bytes_free < 3) {
+      EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize)
+                - bytes_free, serialized.packet->length());
+    } else {
+      EXPECT_EQ(client_framer_.GetMaxPlaintextSize(kDefaultMaxPacketSize),
+                serialized.packet->length());
+    }
+
+    delete serialized.packet;
+    frames_.clear();
+  }
+}
+
 TEST_P(QuicPacketCreatorTest, SerializeConnectionClose) {
   QuicConnectionCloseFrame frame;
   frame.error_code = QUIC_NO_ERROR;
@@ -760,23 +806,23 @@
   size_t max_packets_per_fec_group = 10;
   creator_.set_max_packets_per_fec_group(max_packets_per_fec_group);
   creator_.set_sequence_number(64 - max_packets_per_fec_group);
-  creator_.UpdateSequenceNumberLength(2, 10000);
+  creator_.UpdateSequenceNumberLength(2, 10000 / kDefaultMaxPacketSize);
   EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
             creator_.next_sequence_number_length());
 
   creator_.set_sequence_number(64 * 256 - max_packets_per_fec_group);
-  creator_.UpdateSequenceNumberLength(2, 10000);
+  creator_.UpdateSequenceNumberLength(2, 10000 / kDefaultMaxPacketSize);
   EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER,
             creator_.next_sequence_number_length());
 
   creator_.set_sequence_number(64 * 256 * 256 - max_packets_per_fec_group);
-  creator_.UpdateSequenceNumberLength(2, 10000);
+  creator_.UpdateSequenceNumberLength(2, 10000 / kDefaultMaxPacketSize);
   EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
             creator_.next_sequence_number_length());
 
   creator_.set_sequence_number(
       GG_UINT64_C(64) * 256 * 256 * 256 * 256 - max_packets_per_fec_group);
-  creator_.UpdateSequenceNumberLength(2, 10000);
+  creator_.UpdateSequenceNumberLength(2, 10000 / kDefaultMaxPacketSize);
   EXPECT_EQ(PACKET_6BYTE_SEQUENCE_NUMBER,
             creator_.next_sequence_number_length());
 }
@@ -785,20 +831,21 @@
   EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
             creator_.next_sequence_number_length());
 
-  creator_.UpdateSequenceNumberLength(1, 10000);
+  creator_.UpdateSequenceNumberLength(1, 10000 / kDefaultMaxPacketSize);
   EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
             creator_.next_sequence_number_length());
 
-  creator_.UpdateSequenceNumberLength(1, 10000 * 256);
+  creator_.UpdateSequenceNumberLength(1, 10000 * 256 / kDefaultMaxPacketSize);
   EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER,
             creator_.next_sequence_number_length());
 
-  creator_.UpdateSequenceNumberLength(1, 10000 * 256 * 256);
+  creator_.UpdateSequenceNumberLength(
+      1, 10000 * 256 * 256 / kDefaultMaxPacketSize);
   EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
             creator_.next_sequence_number_length());
 
   creator_.UpdateSequenceNumberLength(
-      1, GG_UINT64_C(1000) * 256 * 256 * 256 * 256);
+      1, GG_UINT64_C(1000) * 256 * 256 * 256 * 256 / kDefaultMaxPacketSize);
   EXPECT_EQ(PACKET_6BYTE_SEQUENCE_NUMBER,
             creator_.next_sequence_number_length());
 }
diff --git a/net/quic/quic_packet_generator.cc b/net/quic/quic_packet_generator.cc
index deb6a9e..2481ddc 100644
--- a/net/quic/quic_packet_generator.cc
+++ b/net/quic/quic_packet_generator.cc
@@ -19,10 +19,10 @@
 // avoid losing them both within the same loss episode. On the other hand,
 // we expect to be able to recover from any loss in about an RTT.
 // We resolve this tradeoff by sending an FEC packet atmost half an RTT,
-// or equivalently, half a cwnd, after the first protected packet. Since we
-// don't want to delay an FEC packet past half an RTT, we set the max FEC
-// group size to be half the current congestion window.
-const float kCongestionWindowMultiplierForFecGroupSize = 0.5;
+// or equivalently, half the max number of in-flight packets,  the first
+// protected packet. Since we don't want to delay an FEC packet past half an
+// RTT, we set the max FEC group size to be half the current congestion window.
+const float kMaxPacketsInFlightMultiplierForFecGroupSize = 0.5;
 
 }  // namespace
 
@@ -85,10 +85,10 @@
 }
 
 void QuicPacketGenerator::OnCongestionWindowChange(
-    QuicByteCount congestion_window) {
+    QuicPacketCount max_packets_in_flight) {
   packet_creator_.set_max_packets_per_fec_group(
-      static_cast<size_t>(kCongestionWindowMultiplierForFecGroupSize *
-                          congestion_window / kDefaultTCPMSS));
+      static_cast<size_t>(kMaxPacketsInFlightMultiplierForFecGroupSize *
+                          max_packets_in_flight));
 }
 
 void QuicPacketGenerator::SetShouldSendAck(bool also_send_feedback,
@@ -378,9 +378,9 @@
 
 void QuicPacketGenerator::UpdateSequenceNumberLength(
       QuicPacketSequenceNumber least_packet_awaited_by_peer,
-      QuicByteCount congestion_window) {
+      QuicPacketCount max_packets_in_flight) {
   return packet_creator_.UpdateSequenceNumberLength(
-      least_packet_awaited_by_peer, congestion_window);
+      least_packet_awaited_by_peer, max_packets_in_flight);
 }
 
 void QuicPacketGenerator::SetConnectionIdLength(uint32 length) {
diff --git a/net/quic/quic_packet_generator.h b/net/quic/quic_packet_generator.h
index 56c3694..3fec02a 100644
--- a/net/quic/quic_packet_generator.h
+++ b/net/quic/quic_packet_generator.h
@@ -100,7 +100,7 @@
   virtual ~QuicPacketGenerator();
 
   // Called by the connection in the event of the congestion window changing.
-  void OnCongestionWindowChange(QuicByteCount congestion_window);
+  void OnCongestionWindowChange(QuicPacketCount max_packets_in_flight);
 
   // Indicates that an ACK frame should be sent.  If |also_send_feedback| is
   // true, then it also indicates a CONGESTION_FEEDBACK frame should be sent.
@@ -165,7 +165,7 @@
   // can be safely changed.
   void UpdateSequenceNumberLength(
       QuicPacketSequenceNumber least_packet_awaited_by_peer,
-      QuicByteCount congestion_window);
+      QuicPacketCount max_packets_in_flight);
 
   // Set the minimum number of bytes for the connection id length;
   void SetConnectionIdLength(uint32 length);
diff --git a/net/quic/quic_packet_generator_test.cc b/net/quic/quic_packet_generator_test.cc
index 8ffa34b..3f2472c 100644
--- a/net/quic/quic_packet_generator_test.cc
+++ b/net/quic/quic_packet_generator_test.cc
@@ -560,15 +560,15 @@
   EXPECT_FALSE(creator_->IsFecGroupOpen());
 
   // On reduced cwnd.
-  generator_.OnCongestionWindowChange(7 * kDefaultTCPMSS);
+  generator_.OnCongestionWindowChange(7);
   EXPECT_EQ(3u, creator_->max_packets_per_fec_group());
 
   // On increased cwnd.
-  generator_.OnCongestionWindowChange(100 * kDefaultTCPMSS);
+  generator_.OnCongestionWindowChange(100);
   EXPECT_EQ(50u, creator_->max_packets_per_fec_group());
 
   // On collapsed cwnd.
-  generator_.OnCongestionWindowChange(1 * kDefaultTCPMSS);
+  generator_.OnCongestionWindowChange(1);
   EXPECT_EQ(2u, creator_->max_packets_per_fec_group());
 }
 
@@ -599,7 +599,7 @@
   EXPECT_TRUE(creator_->IsFecGroupOpen());
 
   // Change FEC groupsize.
-  generator_.OnCongestionWindowChange(2 * kDefaultTCPMSS);
+  generator_.OnCongestionWindowChange(2);
   EXPECT_EQ(2u, creator_->max_packets_per_fec_group());
 
   // Send enough data to trigger one unprotected data packet,
diff --git a/net/quic/quic_protocol.h b/net/quic/quic_protocol.h
index 64d0c23..afd5ed4 100644
--- a/net/quic/quic_protocol.h
+++ b/net/quic/quic_protocol.h
@@ -60,8 +60,8 @@
 const QuicByteCount kDefaultTCPMSS = 1460;
 
 // Maximum size of the initial congestion window in packets.
-const size_t kDefaultInitialWindow = 10;
-const uint32 kMaxInitialWindow = 100;
+const QuicPacketCount kDefaultInitialWindow = 10;
+const QuicPacketCount kMaxInitialWindow = 100;
 
 // Default size of initial flow control window, for both stream and session.
 const uint32 kDefaultFlowControlSendWindow = 16 * 1024;  // 16 KB
@@ -396,8 +396,9 @@
   QUIC_STREAM_PEER_GOING_AWAY,
   // The stream has been cancelled.
   QUIC_STREAM_CANCELLED,
-  // Sending a RST to allow for proper flow control accounting.
-  QUIC_RST_FLOW_CONTROL_ACCOUNTING,
+  // Closing stream locally, sending a RST to allow for proper flow control
+  // accounting. Sent in response to a RST from the peer.
+  QUIC_RST_ACKNOWLEDGEMENT,
 
   // No error. Used as bound while iterating.
   QUIC_STREAM_LAST_ERROR,
diff --git a/net/quic/quic_protocol_test.cc b/net/quic/quic_protocol_test.cc
index 43a009a..9460906 100644
--- a/net/quic/quic_protocol_test.cc
+++ b/net/quic/quic_protocol_test.cc
@@ -18,9 +18,9 @@
 
   // If we ever add different RST codes, we should have a test akin to the
   // following.
-  //  EXPECT_EQ(QUIC_RST_FLOW_CONTROL_ACCOUNTING, AdjustErrorForVersion(
-  //      QUIC_RST_FLOW_CONTROL_ACCOUNTING,
-  //      QUIC_VERSION_18));
+  //  EXPECT_EQ(QUIC_RST_ACKNOWLEDGEMENT, AdjustErrorForVersion(
+  //      QUIC_RST_ACKNOWLEDGEMENT,
+  //      QUIC_VERSION_23));
 }
 
 TEST(QuicProtocolTest, MakeQuicTag) {
diff --git a/net/quic/quic_sent_packet_manager.cc b/net/quic/quic_sent_packet_manager.cc
index 6370d9f..bdf8690 100644
--- a/net/quic/quic_sent_packet_manager.cc
+++ b/net/quic/quic_sent_packet_manager.cc
@@ -192,7 +192,7 @@
       send_algorithm_->BandwidthEstimate(),
       ack_receive_time,
       clock_->WallNow(),
-      rtt_stats_.SmoothedRtt());
+      rtt_stats_.smoothed_rtt());
 
   // If we have received a truncated ack, then we need to clear out some
   // previous transmissions to allow the peer to actually ACK new packets.
@@ -819,15 +819,21 @@
     const {
   // This is equivalent to the TailLossProbeDelay, but slightly more aggressive
   // because crypto handshake messages don't incur a delayed ack time.
-  int64 delay_ms =
-      max(kMinHandshakeTimeoutMs,
-          static_cast<int64>(1.5 * rtt_stats_.SmoothedRtt().ToMilliseconds()));
+  QuicTime::Delta srtt = rtt_stats_.smoothed_rtt();
+  if (srtt.IsZero()) {
+    srtt = QuicTime::Delta::FromMicroseconds(rtt_stats_.initial_rtt_us());
+  }
+  int64 delay_ms = max(kMinHandshakeTimeoutMs,
+                       static_cast<int64>(1.5 * srtt.ToMilliseconds()));
   return QuicTime::Delta::FromMilliseconds(
       delay_ms << consecutive_crypto_retransmission_count_);
 }
 
 const QuicTime::Delta QuicSentPacketManager::GetTailLossProbeDelay() const {
-  QuicTime::Delta srtt = rtt_stats_.SmoothedRtt();
+  QuicTime::Delta srtt = rtt_stats_.smoothed_rtt();
+  if (srtt.IsZero()) {
+    srtt = QuicTime::Delta::FromMicroseconds(rtt_stats_.initial_rtt_us());
+  }
   if (!unacked_packets_.HasMultipleInFlightPackets()) {
     return QuicTime::Delta::Max(
         srtt.Multiply(2), srtt.Multiply(1.5).Add(
@@ -865,6 +871,8 @@
 }
 
 QuicBandwidth QuicSentPacketManager::BandwidthEstimate() const {
+  // TODO(ianswett): Remove BandwidthEstimate from SendAlgorithmInterface
+  // and implement the logic here.
   return send_algorithm_->BandwidthEstimate();
 }
 
@@ -877,12 +885,17 @@
   return sustained_bandwidth_recorder_;
 }
 
-QuicByteCount QuicSentPacketManager::GetCongestionWindow() const {
-  return send_algorithm_->GetCongestionWindow();
+QuicPacketCount QuicSentPacketManager::EstimateMaxPacketsInFlight(
+    QuicByteCount max_packet_length) const {
+  return send_algorithm_->GetCongestionWindow() / max_packet_length;
 }
 
-QuicByteCount QuicSentPacketManager::GetSlowStartThreshold() const {
-  return send_algorithm_->GetSlowStartThreshold();
+QuicPacketCount QuicSentPacketManager::GetCongestionWindowInTcpMss() const {
+  return send_algorithm_->GetCongestionWindow() / kDefaultTCPMSS;
+}
+
+QuicPacketCount QuicSentPacketManager::GetSlowStartThresholdInTcpMss() const {
+  return send_algorithm_->GetSlowStartThreshold() / kDefaultTCPMSS;
 }
 
 void QuicSentPacketManager::EnablePacing() {
diff --git a/net/quic/quic_sent_packet_manager.h b/net/quic/quic_sent_packet_manager.h
index cccacab..f82e34b 100644
--- a/net/quic/quic_sent_packet_manager.h
+++ b/net/quic/quic_sent_packet_manager.h
@@ -182,15 +182,22 @@
 
   const QuicSustainedBandwidthRecorder& SustainedBandwidthRecorder() const;
 
-  // Returns the size of the current congestion window in bytes.  Note, this is
-  // not the *available* window.  Some send algorithms may not use a congestion
-  // window and will return 0.
-  QuicByteCount GetCongestionWindow() const;
+  // Returns the size of the current congestion window in number of
+  // kDefaultTCPMSS-sized segments. Note, this is not the *available* window.
+  // Some send algorithms may not use a congestion window and will return 0.
+  QuicPacketCount GetCongestionWindowInTcpMss() const;
 
-  // Returns the size of the slow start congestion window in bytes,
-  // aka ssthresh.  Some send algorithms do not define a slow start
-  // threshold and will return 0.
-  QuicByteCount GetSlowStartThreshold() const;
+  // Returns the number of packets of length |max_packet_length| which fit in
+  // the current congestion window. More packets may end up in flight if the
+  // congestion window has been recently reduced, of if non-full packets are
+  // sent.
+  QuicPacketCount EstimateMaxPacketsInFlight(
+      QuicByteCount max_packet_length) const;
+
+  // Returns the size of the slow start congestion window in nume of 1460 byte
+  // TCP segments, aka ssthresh.  Some send algorithms do not define a slow
+  // start threshold and will return 0.
+  QuicPacketCount GetSlowStartThresholdInTcpMss() const;
 
   // Enables pacing if it has not already been enabled.
   void EnablePacing();
diff --git a/net/quic/quic_sent_packet_manager_test.cc b/net/quic/quic_sent_packet_manager_test.cc
index bf8c99c..d7a846a 100644
--- a/net/quic/quic_sent_packet_manager_test.cc
+++ b/net/quic/quic_sent_packet_manager_test.cc
@@ -1025,7 +1025,7 @@
   QuicSentPacketManagerPeer::GetRttStats(&manager_)->UpdateRtt(
       min_rtt, QuicTime::Delta::Zero(), QuicTime::Zero());
   EXPECT_EQ(min_rtt,
-            QuicSentPacketManagerPeer::GetRttStats(&manager_)->MinRtt());
+            QuicSentPacketManagerPeer::GetRttStats(&manager_)->min_rtt());
   EXPECT_EQ(min_rtt,
             QuicSentPacketManagerPeer::GetRttStats(
                 &manager_)->recent_min_rtt());
@@ -1052,7 +1052,7 @@
   manager_.OnIncomingAck(ack_frame, clock_.Now());
 
   EXPECT_EQ(min_rtt,
-            QuicSentPacketManagerPeer::GetRttStats(&manager_)->MinRtt());
+            QuicSentPacketManagerPeer::GetRttStats(&manager_)->min_rtt());
   EXPECT_EQ(QuicTime::Delta::FromMilliseconds(100),
             QuicSentPacketManagerPeer::GetRttStats(
                 &manager_)->recent_min_rtt());
@@ -1079,16 +1079,16 @@
   SendCryptoPacket(1);
 
   // Check the min.
-  QuicSentPacketManagerPeer::GetRttStats(&manager_)->set_initial_rtt_us(
-      1 * base::Time::kMicrosecondsPerMillisecond);
+  RttStats* rtt_stats = QuicSentPacketManagerPeer::GetRttStats(&manager_);
+  rtt_stats->set_initial_rtt_us(1 * base::Time::kMicrosecondsPerMillisecond);
   EXPECT_EQ(clock_.Now().Add(QuicTime::Delta::FromMilliseconds(10)),
             manager_.GetRetransmissionTime());
 
   // Test with a standard smoothed RTT.
-  QuicSentPacketManagerPeer::GetRttStats(&manager_)->set_initial_rtt_us(
-      100 * base::Time::kMicrosecondsPerMillisecond);
+  rtt_stats->set_initial_rtt_us(100 * base::Time::kMicrosecondsPerMillisecond);
 
-  QuicTime::Delta srtt = manager_.GetRttStats()->SmoothedRtt();
+  QuicTime::Delta srtt =
+      QuicTime::Delta::FromMicroseconds(rtt_stats->initial_rtt_us());
   QuicTime expected_time = clock_.Now().Add(srtt.Multiply(1.5));
   EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
 
@@ -1108,15 +1108,15 @@
   SendDataPacket(2);
 
   // Check the min.
-  QuicSentPacketManagerPeer::GetRttStats(&manager_)->set_initial_rtt_us(
-      1 * base::Time::kMicrosecondsPerMillisecond);
+  RttStats* rtt_stats = QuicSentPacketManagerPeer::GetRttStats(&manager_);
+  rtt_stats->set_initial_rtt_us(1 * base::Time::kMicrosecondsPerMillisecond);
   EXPECT_EQ(clock_.Now().Add(QuicTime::Delta::FromMilliseconds(10)),
             manager_.GetRetransmissionTime());
 
   // Test with a standard smoothed RTT.
-  QuicSentPacketManagerPeer::GetRttStats(&manager_)->set_initial_rtt_us(
-      100 * base::Time::kMicrosecondsPerMillisecond);
-  QuicTime::Delta srtt = manager_.GetRttStats()->SmoothedRtt();
+  rtt_stats->set_initial_rtt_us(100 * base::Time::kMicrosecondsPerMillisecond);
+  QuicTime::Delta srtt =
+      QuicTime::Delta::FromMicroseconds(rtt_stats->initial_rtt_us());
   QuicTime::Delta expected_tlp_delay = srtt.Multiply(2);
   QuicTime expected_time = clock_.Now().Add(expected_tlp_delay);
   EXPECT_EQ(expected_time, manager_.GetRetransmissionTime());
@@ -1420,7 +1420,7 @@
 TEST_F(QuicSentPacketManagerTest, UseInitialRoundTripTimeToSend) {
   uint32 initial_rtt_us = 325000;
   EXPECT_NE(initial_rtt_us,
-            manager_.GetRttStats()->SmoothedRtt().ToMicroseconds());
+            manager_.GetRttStats()->smoothed_rtt().ToMicroseconds());
 
   QuicConfig config;
   config.SetInitialRoundTripTimeUsToSend(initial_rtt_us);
@@ -1428,8 +1428,8 @@
   EXPECT_CALL(*network_change_visitor_, OnCongestionWindowChange());
   manager_.SetFromConfig(config);
 
-  EXPECT_EQ(initial_rtt_us,
-            manager_.GetRttStats()->SmoothedRtt().ToMicroseconds());
+  EXPECT_EQ(0, manager_.GetRttStats()->smoothed_rtt().ToMicroseconds());
+  EXPECT_EQ(initial_rtt_us, manager_.GetRttStats()->initial_rtt_us());
 }
 
 }  // namespace
diff --git a/net/quic/quic_server.cc b/net/quic/quic_server.cc
index b8013c4..fecb4e5 100644
--- a/net/quic/quic_server.cc
+++ b/net/quic/quic_server.cc
@@ -29,8 +29,6 @@
 // the limit.
 const int kReadBufferSize = 2 * kMaxPacketSize;
 
-const uint32 kServerInitialFlowControlWindow = 100 * kMaxPacketSize;
-
 } // namespace
 
 QuicServer::QuicServer(const QuicConfig& config,
@@ -53,11 +51,9 @@
   QuicInMemoryCache::GetInstance();
 
   scoped_ptr<CryptoHandshakeMessage> scfg(
-      crypto_config_.AddDefaultConfig(helper_.GetRandomGenerator(),
-                                      helper_.GetClock(),
-                                      QuicCryptoServerConfig::ConfigOptions()));
-
-  config_.SetInitialCongestionWindowToSend(kServerInitialFlowControlWindow);
+      crypto_config_.AddDefaultConfig(
+          helper_.GetRandomGenerator(), helper_.GetClock(),
+          QuicCryptoServerConfig::ConfigOptions()));
 }
 
 QuicServer::~QuicServer() {
diff --git a/net/quic/quic_server_session.cc b/net/quic/quic_server_session.cc
index efb0bcf..7fab509 100644
--- a/net/quic/quic_server_session.cc
+++ b/net/quic/quic_server_session.cc
@@ -15,8 +15,9 @@
 
 QuicServerSession::QuicServerSession(const QuicConfig& config,
                                      QuicConnection* connection,
-                                     QuicServerSessionVisitor* visitor)
-    : QuicSession(connection, config),
+                                     QuicServerSessionVisitor* visitor,
+                                     bool is_secure)
+    : QuicSession(connection, config, is_secure),
       visitor_(visitor),
       bandwidth_estimate_sent_to_client_(QuicBandwidth::Zero()),
       last_scup_time_(QuicTime::Zero()),
@@ -73,7 +74,7 @@
   const QuicSentPacketManager& sent_packet_manager =
       connection()->sent_packet_manager();
   int64 srtt_ms =
-      sent_packet_manager.GetRttStats()->SmoothedRtt().ToMilliseconds();
+      sent_packet_manager.GetRttStats()->smoothed_rtt().ToMilliseconds();
   int64 now_ms = now.Subtract(last_scup_time_).ToMilliseconds();
   int64 packets_since_last_scup =
       connection()->sequence_number_of_last_sent_packet() -
@@ -127,7 +128,7 @@
   cached_network_params.set_max_bandwidth_timestamp_seconds(
       max_bandwidth_timestamp);
   cached_network_params.set_min_rtt_ms(
-      sent_packet_manager.GetRttStats()->MinRtt().ToMilliseconds());
+      sent_packet_manager.GetRttStats()->min_rtt().ToMilliseconds());
   cached_network_params.set_previous_connection_state(
       bandwidth_recorder.EstimateRecordedDuringSlowStart()
           ? CachedNetworkParameters::SLOW_START
diff --git a/net/quic/quic_server_session.h b/net/quic/quic_server_session.h
index 43107a0..a402005 100644
--- a/net/quic/quic_server_session.h
+++ b/net/quic/quic_server_session.h
@@ -46,7 +46,8 @@
  public:
   QuicServerSession(const QuicConfig& config,
                     QuicConnection* connection,
-                    QuicServerSessionVisitor* visitor);
+                    QuicServerSessionVisitor* visitor,
+                    bool is_secure);
 
   // Override the base class to notify the owner of the connection close.
   void OnConnectionClosed(QuicErrorCode error, bool from_peer) override;
diff --git a/net/quic/quic_session.cc b/net/quic/quic_session.cc
index 4e1fc7b..34a668d 100644
--- a/net/quic/quic_session.cc
+++ b/net/quic/quic_session.cc
@@ -95,7 +95,8 @@
   QuicSession* session_;
 };
 
-QuicSession::QuicSession(QuicConnection* connection, const QuicConfig& config)
+QuicSession::QuicSession(QuicConnection* connection, const QuicConfig& config,
+                         bool is_secure)
     : connection_(connection),
       visitor_shim_(new VisitorShim(this)),
       config_(config),
@@ -105,7 +106,8 @@
       error_(QUIC_NO_ERROR),
       goaway_received_(false),
       goaway_sent_(false),
-      has_pending_handshake_(false) {
+      has_pending_handshake_(false),
+      is_secure_(is_secure) {
   if (connection_->version() == QUIC_VERSION_19) {
     flow_controller_.reset(new QuicFlowController(
         connection_.get(), 0, is_server(), kDefaultFlowControlSendWindow,
diff --git a/net/quic/quic_session.h b/net/quic/quic_session.h
index 1bca3aa..6ca9ce0 100644
--- a/net/quic/quic_session.h
+++ b/net/quic/quic_session.h
@@ -52,7 +52,9 @@
     HANDSHAKE_CONFIRMED,
   };
 
-  QuicSession(QuicConnection* connection, const QuicConfig& config);
+  QuicSession(QuicConnection* connection,
+              const QuicConfig& config,
+              bool is_secure);
   void InitializeSession();
 
   ~QuicSession() override;
@@ -209,6 +211,11 @@
   // Returns true if any stream is flow controller blocked.
   bool IsStreamFlowControlBlocked();
 
+  // Returns true if this is a secure QUIC session.
+  bool is_secure() const {
+    return is_secure_;
+  }
+
   size_t get_max_open_streams() const { return max_open_streams_; }
 
  protected:
@@ -326,6 +333,9 @@
   // Used for session level flow control.
   scoped_ptr<QuicFlowController> flow_controller_;
 
+  // True if this is a secure (HTTPS) QUIC session.
+  bool is_secure_;
+
   DISALLOW_COPY_AND_ASSIGN(QuicSession);
 };
 
diff --git a/net/quic/quic_session_test.cc b/net/quic/quic_session_test.cc
index c248460..edbfbee 100644
--- a/net/quic/quic_session_test.cc
+++ b/net/quic/quic_session_test.cc
@@ -126,7 +126,8 @@
  public:
   explicit TestSession(QuicConnection* connection)
       : QuicSession(connection,
-                    DefaultQuicConfig()),
+                    DefaultQuicConfig(),
+                    false),
         crypto_stream_(this),
         writev_consumes_all_data_(false) {
     InitializeSession();
@@ -399,7 +400,7 @@
   EXPECT_CALL(*send_algorithm, TimeUntilSend(_, _, _)).WillRepeatedly(
       Return(QuicTime::Delta::Zero()));
   EXPECT_CALL(*send_algorithm, GetCongestionWindow())
-      .WillOnce(Return(kMaxPacketSize * 10));
+      .WillRepeatedly(Return(kMaxPacketSize * 10));
   EXPECT_CALL(*stream2, OnCanWrite())
       .WillOnce(IgnoreResult(Invoke(CreateFunctor(
           &session_, &TestSession::SendStreamData, stream2->id()))));
diff --git a/net/quic/quic_stream_factory.cc b/net/quic/quic_stream_factory.cc
index 678463e..cf70608 100644
--- a/net/quic/quic_stream_factory.cc
+++ b/net/quic/quic_stream_factory.cc
@@ -946,7 +946,7 @@
 
   *session = new QuicClientSession(
       connection, socket.Pass(), this, transport_security_state_,
-      server_info.Pass(), config,
+      server_info.Pass(), config, server_id.is_https(),
       base::MessageLoop::current()->message_loop_proxy().get(),
       net_log.net_log());
   all_sessions_[*session] = server_id;  // owning pointer
diff --git a/net/quic/quic_stream_factory_test.cc b/net/quic/quic_stream_factory_test.cc
index 4818620..1165b9c 100644
--- a/net/quic/quic_stream_factory_test.cc
+++ b/net/quic/quic_stream_factory_test.cc
@@ -240,7 +240,7 @@
     QuicStreamId stream_id = kClientDataStreamId1;
     return maker_.MakeRstPacket(
         1, true, stream_id,
-        AdjustErrorForVersion(QUIC_RST_FLOW_CONTROL_ACCOUNTING, GetParam()));
+        AdjustErrorForVersion(QUIC_RST_ACKNOWLEDGEMENT, GetParam()));
   }
 
   MockQuicServerInfoFactory quic_server_info_factory_;
diff --git a/net/quic/quic_time_wait_list_manager.cc b/net/quic/quic_time_wait_list_manager.cc
index 42dae00..d59cbc4 100644
--- a/net/quic/quic_time_wait_list_manager.cc
+++ b/net/quic/quic_time_wait_list_manager.cc
@@ -27,8 +27,9 @@
 
 namespace {
 
-// Time period for which the connection_id should live in time wait state..
-const int kTimeWaitSeconds = 5;
+// Time period for which a given connection_id should live in the time-wait
+// state.
+int64 FLAGS_quic_time_wait_list_seconds = 5;
 
 }  // namespace
 
@@ -86,7 +87,8 @@
     QuicConnectionHelperInterface* helper,
     const QuicVersionVector& supported_versions)
     : helper_(helper),
-      kTimeWaitPeriod_(QuicTime::Delta::FromSeconds(kTimeWaitSeconds)),
+      kTimeWaitPeriod_(
+          QuicTime::Delta::FromSeconds(FLAGS_quic_time_wait_list_seconds)),
       connection_id_clean_up_alarm_(
           helper_->CreateAlarm(new ConnectionIdCleanUpAlarm(this))),
       writer_(writer),
@@ -274,6 +276,7 @@
       break;
     }
     // This connection_id has lived its age, retire it now.
+    DVLOG(1) << "Retiring " << it->first << " from the time-wait state.";
     delete it->second.close_packet;
     connection_id_map_.erase(it);
   }
diff --git a/net/quic/quic_utils.cc b/net/quic/quic_utils.cc
index 908e26f..d786a95 100644
--- a/net/quic/quic_utils.cc
+++ b/net/quic/quic_utils.cc
@@ -138,7 +138,7 @@
     RETURN_STRING_LITERAL(QUIC_BAD_APPLICATION_PAYLOAD);
     RETURN_STRING_LITERAL(QUIC_STREAM_PEER_GOING_AWAY);
     RETURN_STRING_LITERAL(QUIC_STREAM_CANCELLED);
-    RETURN_STRING_LITERAL(QUIC_RST_FLOW_CONTROL_ACCOUNTING);
+    RETURN_STRING_LITERAL(QUIC_RST_ACKNOWLEDGEMENT);
     RETURN_STRING_LITERAL(QUIC_STREAM_LAST_ERROR);
   }
   // Return a default value so that we return this when |error| doesn't match
diff --git a/net/quic/reliable_quic_stream.cc b/net/quic/reliable_quic_stream.cc
index 7db9a57..70b6d9a 100644
--- a/net/quic/reliable_quic_stream.cc
+++ b/net/quic/reliable_quic_stream.cc
@@ -457,7 +457,7 @@
     // written on this stream before termination. Done here if needed, using a
     // RST frame.
     DVLOG(1) << ENDPOINT << "Sending RST in OnClose: " << id();
-    session_->SendRstStream(id(), QUIC_RST_FLOW_CONTROL_ACCOUNTING,
+    session_->SendRstStream(id(), QUIC_RST_ACKNOWLEDGEMENT,
                             stream_bytes_written_);
     rst_sent_ = true;
   }
diff --git a/net/quic/test_tools/quic_test_utils.cc b/net/quic/test_tools/quic_test_utils.cc
index fad194b..ae3abfe 100644
--- a/net/quic/test_tools/quic_test_utils.cc
+++ b/net/quic/test_tools/quic_test_utils.cc
@@ -316,7 +316,7 @@
 }
 
 MockSession::MockSession(QuicConnection* connection)
-    : QuicSession(connection, DefaultQuicConfig()) {
+    : QuicSession(connection, DefaultQuicConfig(), /*is_secure=*/false) {
   InitializeSession();
   ON_CALL(*this, WritevData(_, _, _, _, _, _))
       .WillByDefault(testing::Return(QuicConsumedData(0, false)));
@@ -326,7 +326,8 @@
 }
 
 TestSession::TestSession(QuicConnection* connection, const QuicConfig& config)
-    : QuicSession(connection, config), crypto_stream_(nullptr) {
+    : QuicSession(connection, config, /*is_secure=*/false),
+      crypto_stream_(nullptr) {
   InitializeSession();
 }
 
@@ -342,7 +343,7 @@
 
 TestClientSession::TestClientSession(QuicConnection* connection,
                                      const QuicConfig& config)
-    : QuicClientSessionBase(connection, config),
+    : QuicClientSessionBase(connection, config, /*is_secure=*/false),
       crypto_stream_(nullptr) {
   EXPECT_CALL(*this, OnProofValid(_)).Times(AnyNumber());
   InitializeSession();