diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index 6e9dc2f..a11211b 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -11,7 +11,7 @@
     "constraint, update this by running tools/generate_package_config.dart."
   ],
   "configVersion": 2,
-  "generated": "2021-02-22T14:34:08.519603",
+  "generated": "2021-02-22T20:16:11.942470",
   "generator": "tools/generate_package_config.dart",
   "packages": [
     {
diff --git a/DEPS b/DEPS
index deb7166..022463e 100644
--- a/DEPS
+++ b/DEPS
@@ -126,7 +126,7 @@
   "mime_rev": "c931f4bed87221beaece356494b43731445ce7b8",
   "mockito_rev": "d39ac507483b9891165e422ec98d9fb480037c8b",
   "mustache_rev": "664737ecad027e6b96d0d1e627257efa0e46fcb1",
-  "oauth2_tag": "1.6.0",
+  "oauth2_rev": "95b6c8d96dc37a1723480961665d3477a46dd303",
   "package_config_rev": "249af482de9ebabfc781bf10d6152c938e5ce45e",
   "path_rev": "407ab76187fade41c31e39c745b39661b710106c",
   "pedantic_rev": "df177f6ae531426aaf7bbf0121c90dc89d9c57bf",
@@ -381,7 +381,7 @@
       + "external/github.com/xxgreg/mustache"
       + "@" + Var("mustache_rev"),
   Var("dart_root") + "/third_party/pkg/oauth2":
-      Var("dart_git") + "oauth2.git" + "@" + Var("oauth2_tag"),
+      Var("dart_git") + "oauth2.git" + "@" + Var("oauth2_rev"),
   Var("dart_root") + "/third_party/pkg_tested/package_config":
       Var("dart_git") + "package_config.git" +
       "@" + Var("package_config_rev"),
diff --git a/benchmarks/FfiCall/dart/FfiCall.dart b/benchmarks/FfiCall/dart/FfiCall.dart
index ce48f50..6236369 100644
--- a/benchmarks/FfiCall/dart/FfiCall.dart
+++ b/benchmarks/FfiCall/dart/FfiCall.dart
@@ -208,11 +208,11 @@
 
 typedef NativeFunction2Double = Double Function(Double, Double);
 final function2Double = ffiTestFunctions
-    .lookupFunction<NativeFunction2Double, Function2double>('Function1Double');
+    .lookupFunction<NativeFunction2Double, Function2double>('Function2Double');
 
 typedef NativeFunction4Double = Double Function(Double, Double, Double, Double);
 final function4Double = ffiTestFunctions
-    .lookupFunction<NativeFunction4Double, Function4double>('Function1Double');
+    .lookupFunction<NativeFunction4Double, Function4double>('Function4Double');
 
 typedef NativeFunction10Double = Double Function(Double, Double, Double, Double,
     Double, Double, Double, Double, Double, Double);
@@ -941,9 +941,9 @@
   @override
   void run() {
     final double x = doCall1Float(N);
-    final double expected = N * (N - 1) / 2 + N * 42;
-    if (0.999 * expected > x && x > 1.001 * expected) {
-      throw Exception('$name: Unexpected result: $x');
+    final double expected = N * (17.0 + 42);
+    if (0.999 * expected > x || x > 1.001 * expected) {
+      throw Exception('$name: Unexpected result: $x, expected $expected');
     }
   }
 }
@@ -954,9 +954,9 @@
   @override
   void run() {
     final double x = doCall2Float(N);
-    final double expected = N * 55.0;
-    if (0.999 * expected > x && x > 1.001 * expected) {
-      throw Exception('$name: Unexpected result: $x');
+    final double expected = N * (1.0 + 2.0);
+    if (0.999 * expected > x || x > 1.001 * expected) {
+      throw Exception('$name: Unexpected result: $x, expected $expected');
     }
   }
 }
@@ -967,9 +967,9 @@
   @override
   void run() {
     final double x = doCall4Float(N);
-    final double expected = N * 55.0;
-    if (0.999 * expected > x && x > 1.001 * expected) {
-      throw Exception('$name: Unexpected result: $x');
+    final double expected = N * (1.0 + 2.0 + 3.0 + 4.0);
+    if (0.999 * expected > x || x > 1.001 * expected) {
+      throw Exception('$name: Unexpected result: $x, expected $expected');
     }
   }
 }
@@ -980,9 +980,10 @@
   @override
   void run() {
     final double x = doCall10Float(N);
-    final double expected = N * 55.0;
-    if (0.999 * expected > x && x > 1.001 * expected) {
-      throw Exception('$name: Unexpected result: $x');
+    final double expected =
+        N * (1.0 + 2.0 + 3.0 + 4.0 + 5.0 + 6.0 + 7.0 + 8.0 + 9.0 + 10.0);
+    if (0.999 * expected > x || x > 1.001 * expected) {
+      throw Exception('$name: Unexpected result: $x, expected $expected');
     }
   }
 }
@@ -993,9 +994,29 @@
   @override
   void run() {
     final double x = doCall20Float(N);
-    final double expected = N * 220.0;
-    if (0.999 * expected > x && x > 1.001 * expected) {
-      throw Exception('$name: Unexpected result: $x');
+    final double expected = N *
+        (1.0 +
+            2.0 +
+            3.0 +
+            4.0 +
+            5.0 +
+            6.0 +
+            7.0 +
+            8.0 +
+            9.0 +
+            10.0 +
+            11.0 +
+            12.0 +
+            13.0 +
+            14.0 +
+            15.0 +
+            16.0 +
+            17.0 +
+            18.0 +
+            19.0 +
+            20.0);
+    if (0.999 * expected > x || x > 1.001 * expected) {
+      throw Exception('$name: Unexpected result: $x, expected $expected');
     }
   }
 }
@@ -1006,9 +1027,9 @@
   @override
   void run() {
     final double x = doCall1Double(N);
-    final double expected = N * (N - 1) / 2 + N * 42;
-    if (0.999 * expected > x && x > 1.001 * expected) {
-      throw Exception('$name: Unexpected result: $x');
+    final double expected = N * (17.0 + 42.0);
+    if (0.999 * expected > x || x > 1.001 * expected) {
+      throw Exception('$name: Unexpected result: $x, expected $expected');
     }
   }
 }
@@ -1019,9 +1040,9 @@
   @override
   void run() {
     final double x = doCall2Double(N);
-    final double expected = N * 55.0;
-    if (0.999 * expected > x && x > 1.001 * expected) {
-      throw Exception('$name: Unexpected result: $x');
+    final double expected = N * (1.0 + 2.0);
+    if (0.999 * expected > x || x > 1.001 * expected) {
+      throw Exception('$name: Unexpected result: $x, expected $expected');
     }
   }
 }
@@ -1032,9 +1053,9 @@
   @override
   void run() {
     final double x = doCall4Double(N);
-    final double expected = N * 55.0;
-    if (0.999 * expected > x && x > 1.001 * expected) {
-      throw Exception('$name: Unexpected result: $x');
+    final double expected = N * (1.0 + 2.0 + 3.0 + 4.0);
+    if (0.999 * expected > x || x > 1.001 * expected) {
+      throw Exception('$name: Unexpected result: $x, expected $expected');
     }
   }
 }
@@ -1045,9 +1066,10 @@
   @override
   void run() {
     final double x = doCall10Double(N);
-    final double expected = N * 55.0;
-    if (0.999 * expected > x && x > 1.001 * expected) {
-      throw Exception('$name: Unexpected result: $x');
+    final double expected =
+        N * (1.0 + 2.0 + 3.0 + 4.0 + 5.0 + 6.0 + 7.0 + 8.0 + 9.0 + 10.0);
+    if (0.999 * expected > x || x > 1.001 * expected) {
+      throw Exception('$name: Unexpected result: $x, expected $expected');
     }
   }
 }
@@ -1058,9 +1080,29 @@
   @override
   void run() {
     final double x = doCall20Double(N);
-    final double expected = N * 220.0;
-    if (0.999 * expected > x && x > 1.001 * expected) {
-      throw Exception('$name: Unexpected result: $x');
+    final double expected = N *
+        (1.0 +
+            2.0 +
+            3.0 +
+            4.0 +
+            5.0 +
+            6.0 +
+            7.0 +
+            8.0 +
+            9.0 +
+            10.0 +
+            11.0 +
+            12.0 +
+            13.0 +
+            14.0 +
+            15.0 +
+            16.0 +
+            17.0 +
+            18.0 +
+            19.0 +
+            20.0);
+    if (0.999 * expected > x || x > 1.001 * expected) {
+      throw Exception('$name: Unexpected result: $x, expected $expected');
     }
   }
 }
diff --git a/benchmarks/FfiCall/dart2/FfiCall.dart b/benchmarks/FfiCall/dart2/FfiCall.dart
index 3e6f297..34b9fc0 100644
--- a/benchmarks/FfiCall/dart2/FfiCall.dart
+++ b/benchmarks/FfiCall/dart2/FfiCall.dart
@@ -210,11 +210,11 @@
 
 typedef NativeFunction2Double = Double Function(Double, Double);
 final function2Double = ffiTestFunctions
-    .lookupFunction<NativeFunction2Double, Function2double>('Function1Double');
+    .lookupFunction<NativeFunction2Double, Function2double>('Function2Double');
 
 typedef NativeFunction4Double = Double Function(Double, Double, Double, Double);
 final function4Double = ffiTestFunctions
-    .lookupFunction<NativeFunction4Double, Function4double>('Function1Double');
+    .lookupFunction<NativeFunction4Double, Function4double>('Function4Double');
 
 typedef NativeFunction10Double = Double Function(Double, Double, Double, Double,
     Double, Double, Double, Double, Double, Double);
@@ -943,9 +943,9 @@
   @override
   void run() {
     final double x = doCall1Float(N);
-    final double expected = N * (N - 1) / 2 + N * 42;
-    if (0.999 * expected > x && x > 1.001 * expected) {
-      throw Exception('$name: Unexpected result: $x');
+    final double expected = N * (17.0 + 42);
+    if (0.999 * expected > x || x > 1.001 * expected) {
+      throw Exception('$name: Unexpected result: $x, expected $expected');
     }
   }
 }
@@ -956,9 +956,9 @@
   @override
   void run() {
     final double x = doCall2Float(N);
-    final double expected = N * 55.0;
-    if (0.999 * expected > x && x > 1.001 * expected) {
-      throw Exception('$name: Unexpected result: $x');
+    final double expected = N * (1.0 + 2.0);
+    if (0.999 * expected > x || x > 1.001 * expected) {
+      throw Exception('$name: Unexpected result: $x, expected $expected');
     }
   }
 }
@@ -969,9 +969,9 @@
   @override
   void run() {
     final double x = doCall4Float(N);
-    final double expected = N * 55.0;
-    if (0.999 * expected > x && x > 1.001 * expected) {
-      throw Exception('$name: Unexpected result: $x');
+    final double expected = N * (1.0 + 2.0 + 3.0 + 4.0);
+    if (0.999 * expected > x || x > 1.001 * expected) {
+      throw Exception('$name: Unexpected result: $x, expected $expected');
     }
   }
 }
@@ -982,9 +982,10 @@
   @override
   void run() {
     final double x = doCall10Float(N);
-    final double expected = N * 55.0;
-    if (0.999 * expected > x && x > 1.001 * expected) {
-      throw Exception('$name: Unexpected result: $x');
+    final double expected =
+        N * (1.0 + 2.0 + 3.0 + 4.0 + 5.0 + 6.0 + 7.0 + 8.0 + 9.0 + 10.0);
+    if (0.999 * expected > x || x > 1.001 * expected) {
+      throw Exception('$name: Unexpected result: $x, expected $expected');
     }
   }
 }
@@ -995,9 +996,29 @@
   @override
   void run() {
     final double x = doCall20Float(N);
-    final double expected = N * 220.0;
-    if (0.999 * expected > x && x > 1.001 * expected) {
-      throw Exception('$name: Unexpected result: $x');
+    final double expected = N *
+        (1.0 +
+            2.0 +
+            3.0 +
+            4.0 +
+            5.0 +
+            6.0 +
+            7.0 +
+            8.0 +
+            9.0 +
+            10.0 +
+            11.0 +
+            12.0 +
+            13.0 +
+            14.0 +
+            15.0 +
+            16.0 +
+            17.0 +
+            18.0 +
+            19.0 +
+            20.0);
+    if (0.999 * expected > x || x > 1.001 * expected) {
+      throw Exception('$name: Unexpected result: $x, expected $expected');
     }
   }
 }
@@ -1008,9 +1029,9 @@
   @override
   void run() {
     final double x = doCall1Double(N);
-    final double expected = N * (N - 1) / 2 + N * 42;
-    if (0.999 * expected > x && x > 1.001 * expected) {
-      throw Exception('$name: Unexpected result: $x');
+    final double expected = N * (17.0 + 42.0);
+    if (0.999 * expected > x || x > 1.001 * expected) {
+      throw Exception('$name: Unexpected result: $x, expected $expected');
     }
   }
 }
@@ -1021,9 +1042,9 @@
   @override
   void run() {
     final double x = doCall2Double(N);
-    final double expected = N * 55.0;
-    if (0.999 * expected > x && x > 1.001 * expected) {
-      throw Exception('$name: Unexpected result: $x');
+    final double expected = N * (1.0 + 2.0);
+    if (0.999 * expected > x || x > 1.001 * expected) {
+      throw Exception('$name: Unexpected result: $x, expected $expected');
     }
   }
 }
@@ -1034,9 +1055,9 @@
   @override
   void run() {
     final double x = doCall4Double(N);
-    final double expected = N * 55.0;
-    if (0.999 * expected > x && x > 1.001 * expected) {
-      throw Exception('$name: Unexpected result: $x');
+    final double expected = N * (1.0 + 2.0 + 3.0 + 4.0);
+    if (0.999 * expected > x || x > 1.001 * expected) {
+      throw Exception('$name: Unexpected result: $x, expected $expected');
     }
   }
 }
@@ -1047,9 +1068,10 @@
   @override
   void run() {
     final double x = doCall10Double(N);
-    final double expected = N * 55.0;
-    if (0.999 * expected > x && x > 1.001 * expected) {
-      throw Exception('$name: Unexpected result: $x');
+    final double expected =
+        N * (1.0 + 2.0 + 3.0 + 4.0 + 5.0 + 6.0 + 7.0 + 8.0 + 9.0 + 10.0);
+    if (0.999 * expected > x || x > 1.001 * expected) {
+      throw Exception('$name: Unexpected result: $x, expected $expected');
     }
   }
 }
@@ -1060,9 +1082,29 @@
   @override
   void run() {
     final double x = doCall20Double(N);
-    final double expected = N * 220.0;
-    if (0.999 * expected > x && x > 1.001 * expected) {
-      throw Exception('$name: Unexpected result: $x');
+    final double expected = N *
+        (1.0 +
+            2.0 +
+            3.0 +
+            4.0 +
+            5.0 +
+            6.0 +
+            7.0 +
+            8.0 +
+            9.0 +
+            10.0 +
+            11.0 +
+            12.0 +
+            13.0 +
+            14.0 +
+            15.0 +
+            16.0 +
+            17.0 +
+            18.0 +
+            19.0 +
+            20.0);
+    if (0.999 * expected > x || x > 1.001 * expected) {
+      throw Exception('$name: Unexpected result: $x, expected $expected');
     }
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart b/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
index 30d1728..03e4627 100644
--- a/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
@@ -11,6 +11,7 @@
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/analysis/context_builder.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:cli_util/cli_util.dart';
 
@@ -50,6 +51,7 @@
       includedPaths: includedPaths,
       excludedPaths: excludedPaths,
     );
+    var fileContentOverlay = FileContentOverlay();
     for (var root in roots) {
       var contextBuilder = ContextBuilderImpl(
         resourceProvider: this.resourceProvider,
@@ -60,6 +62,7 @@
         declaredVariables: DeclaredVariables.fromMap(declaredVariables ?? {}),
         drainStreams: drainStreams,
         enableIndex: enableIndex,
+        fileContentOverlay: fileContentOverlay,
         performanceLog: performanceLog,
         retainDataForTesting: retainDataForTesting,
         sdkPath: sdkPath,
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_builder.dart b/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
index e98ab16..7353694 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_builder.dart
@@ -43,6 +43,7 @@
       DeclaredVariables? declaredVariables,
       bool drainStreams = true,
       bool enableIndex = false,
+      FileContentOverlay? fileContentOverlay,
       List<String>? librarySummaryPaths,
       PerformanceLog? performanceLog,
       bool retainDataForTesting = false,
@@ -54,7 +55,7 @@
     ArgumentError.checkNotNull(sdkPath, 'sdkPath');
 
     byteStore ??= MemoryByteStore();
-    var fileContentOverlay = FileContentOverlay();
+    fileContentOverlay ??= FileContentOverlay();
     performanceLog ??= PerformanceLog(StringBuffer());
 
     DartSdkManager sdkManager = DartSdkManager(sdkPath);
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 16cc361..b8e8b06 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -270,7 +270,7 @@
   return FLAG_warn_on_pause_with_no_debugger || Service::debug_stream.enabled();
 }
 
-void Debugger::InvokeEventHandler(ServiceEvent* event) {
+static void InvokeEventHandler(ServiceEvent* event) {
   ASSERT(!event->IsPause());  // For pause events, call Pause instead.
   Service::HandleEvent(event);
 }
@@ -290,12 +290,12 @@
     return Thread::Current()->StealStickyError();
   }
   ServiceEvent event(isolate_, kind);
-  DebuggerStackTrace* trace = CollectStackTrace();
+  DebuggerStackTrace* trace = DebuggerStackTrace::Collect();
   if (trace->Length() > 0) {
     event.set_top_frame(trace->FrameAt(0));
   }
-  CacheStackTraces(trace, CollectAsyncCausalStackTrace(),
-                   CollectAwaiterReturnStackTrace());
+  CacheStackTraces(trace, DebuggerStackTrace::CollectAsyncCausal(),
+                   DebuggerStackTrace::CollectAwaiterReturn());
   resume_action_ = kContinue;
   Pause(&event);
   HandleSteppingRequest(trace);
@@ -378,7 +378,7 @@
   return bpt;
 }
 
-const char* Debugger::QualifiedFunctionName(const Function& func) {
+static const char* QualifiedFunctionName(const Function& func) {
   const String& func_name = String::Handle(func.name());
   Class& func_class = Class::Handle(func.Owner());
   String& class_name = String::Handle(func_class.Name());
@@ -504,7 +504,7 @@
 }
 
 StringPtr ActivationFrame::QualifiedFunctionName() {
-  return String::New(Debugger::QualifiedFunctionName(function()));
+  return String::New(::dart::QualifiedFunctionName(function()));
 }
 
 StringPtr ActivationFrame::SourceUrl() {
@@ -1568,6 +1568,9 @@
   }
 }
 
+static ActivationFrame* TopDartFrame();
+static bool IsAtAsyncJump(ActivationFrame* top_frame);
+
 bool Debugger::SetupStepOverAsyncSuspension(const char** error) {
   ActivationFrame* top_frame = TopDartFrame();
   if (!IsAtAsyncJump(top_frame)) {
@@ -1592,6 +1595,8 @@
   return true;
 }
 
+static bool CanRewindFrame(intptr_t frame_index, const char** error);
+
 bool Debugger::SetResumeAction(ResumeAction action,
                                intptr_t frame_index,
                                const char** error) {
@@ -1714,13 +1719,14 @@
   isolate_->set_single_step(value);
 }
 
-ActivationFrame* Debugger::CollectDartFrame(Isolate* isolate,
-                                            uword pc,
-                                            StackFrame* frame,
-                                            const Code& code,
-                                            const Array& deopt_frame,
-                                            intptr_t deopt_frame_offset,
-                                            ActivationFrame::Kind kind) {
+static ActivationFrame* CollectDartFrame(
+    Isolate* isolate,
+    uword pc,
+    StackFrame* frame,
+    const Code& code,
+    const Array& deopt_frame,
+    intptr_t deopt_frame_offset,
+    ActivationFrame::Kind kind = ActivationFrame::kRegular) {
   ASSERT(code.ContainsInstructionAt(pc));
   ActivationFrame* activation =
       new ActivationFrame(pc, frame->fp(), frame->sp(), code, deopt_frame,
@@ -1734,9 +1740,9 @@
 }
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
-ArrayPtr Debugger::DeoptimizeToArray(Thread* thread,
-                                     StackFrame* frame,
-                                     const Code& code) {
+static ArrayPtr DeoptimizeToArray(Thread* thread,
+                                  StackFrame* frame,
+                                  const Code& code) {
   ASSERT(code.is_optimized() && !code.is_force_optimized());
   Isolate* isolate = thread->isolate();
   // Create the DeoptContext for this deoptimization.
@@ -1757,7 +1763,7 @@
 }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
-DebuggerStackTrace* Debugger::CollectStackTrace() {
+DebuggerStackTrace* DebuggerStackTrace::Collect() {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Isolate* isolate = thread->isolate();
@@ -1778,21 +1784,22 @@
     }
     if (frame->IsDartFrame()) {
       code = frame->LookupDartCode();
-      AppendCodeFrames(thread, isolate, zone, stack_trace, frame, &code,
-                       &inlined_code, &deopt_frame);
+      stack_trace->AppendCodeFrames(thread, isolate, zone, frame, &code,
+                                    &inlined_code, &deopt_frame);
     }
   }
   return stack_trace;
 }
 
-void Debugger::AppendCodeFrames(Thread* thread,
-                                Isolate* isolate,
-                                Zone* zone,
-                                DebuggerStackTrace* stack_trace,
-                                StackFrame* frame,
-                                Code* code,
-                                Code* inlined_code,
-                                Array* deopt_frame) {
+// Appends at least one stack frame. Multiple frames will be appended
+// if |code| at the frame's pc contains inlined functions.
+void DebuggerStackTrace::AppendCodeFrames(Thread* thread,
+                                          Isolate* isolate,
+                                          Zone* zone,
+                                          StackFrame* frame,
+                                          Code* code,
+                                          Code* inlined_code,
+                                          Array* deopt_frame) {
 #if !defined(DART_PRECOMPILED_RUNTIME)
   if (code->is_optimized()) {
     if (code->is_force_optimized()) {
@@ -1817,20 +1824,19 @@
                      function.ToFullyQualifiedCString());
       }
       intptr_t deopt_frame_offset = it.GetDeoptFpOffset();
-      stack_trace->AddActivation(CollectDartFrame(isolate, it.pc(), frame,
-                                                  *inlined_code, *deopt_frame,
-                                                  deopt_frame_offset));
+      AddActivation(CollectDartFrame(isolate, it.pc(), frame, *inlined_code,
+                                     *deopt_frame, deopt_frame_offset));
     }
     return;
   }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
-  stack_trace->AddActivation(CollectDartFrame(isolate, frame->pc(), frame,
-                                              *code, Object::null_array(), 0));
+  AddActivation(CollectDartFrame(isolate, frame->pc(), frame, *code,
+                                 Object::null_array(), 0));
 }
 
-DebuggerStackTrace* Debugger::CollectAsyncCausalStackTrace() {
+DebuggerStackTrace* DebuggerStackTrace::CollectAsyncCausal() {
   if (FLAG_lazy_async_stacks) {
-    return CollectAsyncLazyStackTrace();
+    return CollectAsyncLazy();
   }
   if (!FLAG_causal_async_stacks) {
     return nullptr;
@@ -1838,7 +1844,7 @@
   UNREACHABLE();  //  FLAG_causal_async_stacks is deprecated.
 }
 
-DebuggerStackTrace* Debugger::CollectAsyncLazyStackTrace() {
+DebuggerStackTrace* DebuggerStackTrace::CollectAsyncLazy() {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Isolate* isolate = thread->isolate();
@@ -1858,8 +1864,8 @@
 
   std::function<void(StackFrame*)> on_sync_frame = [&](StackFrame* frame) {
     code = frame->LookupDartCode();
-    AppendCodeFrames(thread, isolate, zone, stack_trace, frame, &code,
-                     &inlined_code, &deopt_frame);
+    stack_trace->AppendCodeFrames(thread, isolate, zone, frame, &code,
+                                  &inlined_code, &deopt_frame);
   };
 
   StackTraceUtils::CollectFramesLazy(thread, code_array, &pc_offset_array,
@@ -1906,7 +1912,7 @@
   return stack_trace;
 }
 
-DebuggerStackTrace* Debugger::CollectAwaiterReturnStackTrace() {
+DebuggerStackTrace* DebuggerStackTrace::CollectAwaiterReturn() {
 #if defined(DART_PRECOMPILED_RUNTIME)
   // Causal async stacks are not supported in the AOT runtime.
   ASSERT(!FLAG_async_debugger);
@@ -2066,7 +2072,7 @@
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
 
-ActivationFrame* Debugger::TopDartFrame() const {
+static ActivationFrame* TopDartFrame() {
   StackFrameIterator iterator(ValidationPolicy::kDontValidateFrames,
                               Thread::Current(),
                               StackFrameIterator::kNoCrossThreadIteration);
@@ -2085,32 +2091,22 @@
 }
 
 DebuggerStackTrace* Debugger::StackTrace() {
-  return (stack_trace_ != NULL) ? stack_trace_ : CollectStackTrace();
-}
-
-DebuggerStackTrace* Debugger::CurrentStackTrace() {
-  return CollectStackTrace();
+  return (stack_trace_ != NULL) ? stack_trace_ : DebuggerStackTrace::Collect();
 }
 
 DebuggerStackTrace* Debugger::AsyncCausalStackTrace() {
-  return (async_causal_stack_trace_ != NULL) ? async_causal_stack_trace_
-                                             : CollectAsyncCausalStackTrace();
-}
-
-DebuggerStackTrace* Debugger::CurrentAsyncCausalStackTrace() {
-  return CollectAsyncCausalStackTrace();
+  return (async_causal_stack_trace_ != NULL)
+             ? async_causal_stack_trace_
+             : DebuggerStackTrace::CollectAsyncCausal();
 }
 
 DebuggerStackTrace* Debugger::AwaiterStackTrace() {
-  return (awaiter_stack_trace_ != NULL) ? awaiter_stack_trace_
-                                        : CollectAwaiterReturnStackTrace();
+  return (awaiter_stack_trace_ != NULL)
+             ? awaiter_stack_trace_
+             : DebuggerStackTrace::CollectAwaiterReturn();
 }
 
-DebuggerStackTrace* Debugger::CurrentAwaiterStackTrace() {
-  return CollectAwaiterReturnStackTrace();
-}
-
-DebuggerStackTrace* Debugger::StackTraceFrom(const class StackTrace& ex_trace) {
+DebuggerStackTrace* DebuggerStackTrace::From(const class StackTrace& ex_trace) {
   DebuggerStackTrace* stack_trace = new DebuggerStackTrace(8);
   Function& function = Function::Handle();
   Object& code_object = Object::Handle();
@@ -2209,7 +2205,7 @@
 
 void Debugger::PauseException(const Instance& exc) {
   if (FLAG_stress_async_stacks) {
-    CollectAwaiterReturnStackTrace();
+    DebuggerStackTrace::CollectAwaiterReturn();
   }
   // We ignore this exception event when the VM is executing code invoked
   // by the debugger to evaluate variables values, when we see a nested
@@ -2219,8 +2215,9 @@
       (exc_pause_info_ == kNoPauseOnExceptions)) {
     return;
   }
-  DebuggerStackTrace* awaiter_stack_trace = CollectAwaiterReturnStackTrace();
-  DebuggerStackTrace* stack_trace = CollectStackTrace();
+  DebuggerStackTrace* awaiter_stack_trace =
+      DebuggerStackTrace::CollectAwaiterReturn();
+  DebuggerStackTrace* stack_trace = DebuggerStackTrace::Collect();
   if (awaiter_stack_trace != NULL) {
     if (!ShouldPauseOnException(awaiter_stack_trace, exc)) {
       return;
@@ -2235,8 +2232,8 @@
   if (stack_trace->Length() > 0) {
     event.set_top_frame(stack_trace->FrameAt(0));
   }
-  CacheStackTraces(stack_trace, CollectAsyncCausalStackTrace(),
-                   CollectAwaiterReturnStackTrace());
+  CacheStackTraces(stack_trace, DebuggerStackTrace::CollectAsyncCausal(),
+                   DebuggerStackTrace::CollectAwaiterReturn());
   Pause(&event);
   HandleSteppingRequest(stack_trace_);  // we may get a rewind request
   ClearCachedStackTraces();
@@ -2342,11 +2339,11 @@
 // algorithm, which would be simpler.  I believe that it only needs
 // two passes to support the recursive try-the-whole-function case.
 // Rewrite this later, once there are more tests in place.
-TokenPosition Debugger::ResolveBreakpointPos(const Function& func,
-                                             TokenPosition requested_token_pos,
-                                             TokenPosition last_token_pos,
-                                             intptr_t requested_column,
-                                             TokenPosition exact_token_pos) {
+static TokenPosition ResolveBreakpointPos(const Function& func,
+                                          TokenPosition requested_token_pos,
+                                          TokenPosition last_token_pos,
+                                          intptr_t requested_column,
+                                          TokenPosition exact_token_pos) {
   ASSERT(!func.HasOptimizedCode());
 
   requested_token_pos =
@@ -2777,6 +2774,12 @@
   return loc;
 }
 
+#if !defined(DART_PRECOMPILED_RUNTIME)
+static TokenPosition FindExactTokenPosition(const Script& script,
+                                            TokenPosition start_of_line,
+                                            intptr_t column_number);
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
+
 BreakpointLocation* Debugger::SetBreakpoint(const Script& script,
                                             TokenPosition token_pos,
                                             TokenPosition last_token_pos,
@@ -3281,8 +3284,8 @@
   return -1;
 }
 
-// Can the top frame be rewound?
-bool Debugger::CanRewindFrame(intptr_t frame_index, const char** error) const {
+// Can we rewind to the indicated frame?
+static bool CanRewindFrame(intptr_t frame_index, const char** error) {
   // check rewind pc is found
   DebuggerStackTrace* stack = Isolate::Current()->debugger()->StackTrace();
   intptr_t num_frames = stack->Length();
@@ -3539,7 +3542,7 @@
   Pause(&event);
 }
 
-bool Debugger::IsAtAsyncJump(ActivationFrame* top_frame) {
+static bool IsAtAsyncJump(ActivationFrame* top_frame) {
   Zone* zone = Thread::Current()->zone();
   Object& closure_or_null =
       Object::Handle(zone, top_frame->GetAsyncOperation());
@@ -3683,8 +3686,9 @@
                  frame->pc() - frame->code().PayloadStart());
   }
 
-  CacheStackTraces(CollectStackTrace(), CollectAsyncCausalStackTrace(),
-                   CollectAwaiterReturnStackTrace());
+  CacheStackTraces(DebuggerStackTrace::Collect(),
+                   DebuggerStackTrace::CollectAsyncCausal(),
+                   DebuggerStackTrace::CollectAwaiterReturn());
   if (SteppedForSyntheticAsyncBreakpoint()) {
     CleanupSyntheticAsyncBreakpoint();
   }
@@ -3703,27 +3707,31 @@
   if (ignore_breakpoints_ || IsPaused()) {
     return Error::null();
   }
-  DebuggerStackTrace* stack_trace = CollectStackTrace();
+  DebuggerStackTrace* stack_trace = DebuggerStackTrace::Collect();
   ASSERT(stack_trace->Length() > 0);
   ActivationFrame* top_frame = stack_trace->FrameAt(0);
-  ASSERT(top_frame != NULL);
+  ASSERT(top_frame != nullptr);
   CodeBreakpoint* cbpt = GetCodeBreakpoint(top_frame->pc());
-  ASSERT(cbpt != NULL);
+  ASSERT(cbpt != nullptr);
 
   if (!Library::Handle(top_frame->Library()).IsDebuggable()) {
     return Error::null();
   }
 
-  Breakpoint* bpt_hit = FindHitBreakpoint(cbpt->bpt_location_, top_frame);
-  if (bpt_hit == NULL) {
+  BreakpointLocation* bpt_location = cbpt->bpt_location_;
+  if (bpt_location == nullptr) {
+    return Error::null();
+  }
+  Breakpoint* bpt_hit = bpt_location->FindHitBreakpoint(top_frame);
+  if (bpt_hit == nullptr) {
     return Error::null();
   }
 
   if (bpt_hit->is_synthetic_async()) {
-    DebuggerStackTrace* stack_trace = CollectStackTrace();
+    DebuggerStackTrace* stack_trace = DebuggerStackTrace::Collect();
     ASSERT(stack_trace->Length() > 0);
-    CacheStackTraces(stack_trace, CollectAsyncCausalStackTrace(),
-                     CollectAwaiterReturnStackTrace());
+    CacheStackTraces(stack_trace, DebuggerStackTrace::CollectAsyncCausal(),
+                     DebuggerStackTrace::CollectAwaiterReturn());
 
     // Hit a synthetic async breakpoint.
     if (FLAG_verbose_debug) {
@@ -3736,9 +3744,9 @@
           top_frame->pc() - top_frame->code().PayloadStart());
     }
 
-    ASSERT(synthetic_async_breakpoint_ == NULL);
+    ASSERT(synthetic_async_breakpoint_ == nullptr);
     synthetic_async_breakpoint_ = bpt_hit;
-    bpt_hit = NULL;
+    bpt_hit = nullptr;
 
     // We are at the entry of an async function.
     // We issue a step over to resume at the point after the await statement.
@@ -3760,8 +3768,8 @@
                  top_frame->pc() - top_frame->code().PayloadStart());
   }
 
-  CacheStackTraces(stack_trace, CollectAsyncCausalStackTrace(),
-                   CollectAwaiterReturnStackTrace());
+  CacheStackTraces(stack_trace, DebuggerStackTrace::CollectAsyncCausal(),
+                   DebuggerStackTrace::CollectAwaiterReturn());
   SignalPausedEvent(top_frame, bpt_hit);
   // When we single step from a user breakpoint, our next stepping
   // point will be at the exact same pc.  Skip it.
@@ -3772,17 +3780,13 @@
   return Thread::Current()->StealStickyError();
 }
 
-Breakpoint* Debugger::FindHitBreakpoint(BreakpointLocation* location,
-                                        ActivationFrame* top_frame) {
-  if (location == NULL) {
-    return NULL;
-  }
+Breakpoint* BreakpointLocation::FindHitBreakpoint(ActivationFrame* top_frame) {
   // There may be more than one applicable breakpoint at this location, but we
   // will report only one as reached. If there is a single-shot breakpoint, we
   // favor it; then a closure-specific breakpoint ; then an general breakpoint.
 
   // First check for a single-shot breakpoint.
-  Breakpoint* bpt = location->breakpoints();
+  Breakpoint* bpt = breakpoints();
   while (bpt != NULL) {
     if (bpt->IsSingleShot()) {
       return bpt;
@@ -3791,7 +3795,7 @@
   }
 
   // Now check for a closure-specific breakpoint.
-  bpt = location->breakpoints();
+  bpt = breakpoints();
   while (bpt != NULL) {
     if (bpt->IsPerClosure()) {
       Closure& closure = Closure::Handle(top_frame->GetClosure());
@@ -3803,7 +3807,7 @@
   }
 
   // Finally, check for a general breakpoint.
-  bpt = location->breakpoints();
+  bpt = breakpoints();
   while (bpt != NULL) {
     if (bpt->IsRepeated()) {
       return bpt;
@@ -3822,10 +3826,10 @@
     return;
   }
 
-  DebuggerStackTrace* stack_trace = CollectStackTrace();
+  DebuggerStackTrace* stack_trace = DebuggerStackTrace::Collect();
   ASSERT(stack_trace->Length() > 0);
-  CacheStackTraces(stack_trace, CollectAsyncCausalStackTrace(),
-                   CollectAwaiterReturnStackTrace());
+  CacheStackTraces(stack_trace, DebuggerStackTrace::CollectAsyncCausal(),
+                   DebuggerStackTrace::CollectAwaiterReturn());
   // TODO(johnmccutchan): Send |msg| to Observatory.
 
   // We are in the native call to Developer_debugger.  the developer
@@ -3845,8 +3849,8 @@
 
 // Return innermost closure contained in 'function' that contains
 // the given token position.
-FunctionPtr Debugger::FindInnermostClosure(const Function& function,
-                                           TokenPosition token_pos) {
+static FunctionPtr FindInnermostClosure(const Function& function,
+                                        TokenPosition token_pos) {
   ASSERT(function.end_token_pos().IsReal());
   const TokenPosition& func_start = function.token_pos();
   auto thread = Thread::Current();
@@ -3874,9 +3878,9 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 // On single line of code with given column number,
 // Calculate exact tokenPosition
-TokenPosition Debugger::FindExactTokenPosition(const Script& script,
-                                               TokenPosition start_of_line,
-                                               intptr_t column_number) {
+static TokenPosition FindExactTokenPosition(const Script& script,
+                                            TokenPosition start_of_line,
+                                            intptr_t column_number) {
   intptr_t line;
   intptr_t col;
   if (script.GetTokenLocation(start_of_line, &line, &col)) {
diff --git a/runtime/vm/debugger.h b/runtime/vm/debugger.h
index 382eff6..6378fb1 100644
--- a/runtime/vm/debugger.h
+++ b/runtime/vm/debugger.h
@@ -167,6 +167,9 @@
   Breakpoint* breakpoints() const { return this->conditions_; }
   void set_breakpoints(Breakpoint* head) { this->conditions_ = head; }
 
+  // Finds the breakpoint we hit at |location|.
+  Breakpoint* FindHitBreakpoint(ActivationFrame* top_frame);
+
   ScriptPtr script_;
   StringPtr url_;
   TokenPosition token_pos_;
@@ -432,14 +435,33 @@
 
   ActivationFrame* GetHandlerFrame(const Instance& exc_obj) const;
 
+  static DebuggerStackTrace* CollectAwaiterReturn();
+  static DebuggerStackTrace* Collect();
+  // Returns a debugger stack trace corresponding to a dart.core.StackTrace.
+  // Frames corresponding to invisible functions are omitted. It is not valid
+  // to query local variables in the returned stack.
+  static DebuggerStackTrace* From(const class StackTrace& ex_trace);
+
  private:
   void AddActivation(ActivationFrame* frame);
   void AddMarker(ActivationFrame::Kind marker);
   void AddAsyncCausalFrame(uword pc, const Code& code);
 
+  void AppendCodeFrames(Thread* thread,
+                        Isolate* isolate,
+                        Zone* zone,
+                        StackFrame* frame,
+                        Code* code,
+                        Code* inlined_code,
+                        Array* deopt_frame);
+
+  static DebuggerStackTrace* CollectAsyncCausal();
+  static DebuggerStackTrace* CollectAsyncLazy();
+
   ZoneGrowableArray<ActivationFrame*> trace_;
 
   friend class Debugger;
+
   DISALLOW_COPY_AND_ASSIGN(DebuggerStackTrace);
 };
 
@@ -549,21 +571,10 @@
   // The trace returned by StackTrace may have been cached; it is suitable for
   // use when stepping, but otherwise may be out of sync with the current stack.
   DebuggerStackTrace* StackTrace();
-  DebuggerStackTrace* CurrentStackTrace();
 
   DebuggerStackTrace* AsyncCausalStackTrace();
-  DebuggerStackTrace* CurrentAsyncCausalStackTrace();
 
   DebuggerStackTrace* AwaiterStackTrace();
-  DebuggerStackTrace* CurrentAwaiterStackTrace();
-
-  // Returns a debugger stack trace corresponding to a dart.core.StackTrace.
-  // Frames corresponding to invisible functions are omitted. It is not valid
-  // to query local variables in the returned stack.
-  DebuggerStackTrace* StackTraceFrom(const class StackTrace& dart_stacktrace);
-
-  // Utility functions.
-  static const char* QualifiedFunctionName(const Function& func);
 
   // Pause execution for a breakpoint.  Called from generated code.
   ErrorPtr PauseBreakpoint();
@@ -590,6 +601,8 @@
   void PrintSettingsToJSONObject(JSONObject* jsobj) const;
 
   static bool IsDebuggable(const Function& func);
+
+  // IsolateGroupDebugger::
   static bool IsDebugging(Thread* thread, const Function& func);
 
   intptr_t limitBreakpointId() { return next_id_; }
@@ -597,40 +610,28 @@
   // Callback to the debugger to continue frame rewind, post-deoptimization.
   void RewindPostDeopt();
 
-  DebuggerStackTrace* CollectAwaiterReturnStackTrace();
-
  private:
   ErrorPtr PauseRequest(ServiceEvent::EventKind kind);
 
-  // Finds the breakpoint we hit at |location|.
-  Breakpoint* FindHitBreakpoint(BreakpointLocation* location,
-                                ActivationFrame* top_frame);
-
   // Will return false if we are not at an await.
   bool SetupStepOverAsyncSuspension(const char** error);
 
   bool NeedsIsolateEvents();
   bool NeedsDebugEvents();
-  void InvokeEventHandler(ServiceEvent* event);
 
   void SendBreakpointEvent(ServiceEvent::EventKind kind, Breakpoint* bpt);
 
-  bool IsAtAsyncJump(ActivationFrame* top_frame);
+  // IsolateGroupDebugger::
   void FindCompiledFunctions(const Script& script,
                              TokenPosition start_pos,
                              TokenPosition end_pos,
                              GrowableObjectArray* code_function_list);
+  // IsolateGroupDebugger::
   bool FindBestFit(const Script& script,
                    TokenPosition token_pos,
                    TokenPosition last_token_pos,
                    Function* best_fit);
-  FunctionPtr FindInnermostClosure(const Function& function,
-                                   TokenPosition token_pos);
-  TokenPosition ResolveBreakpointPos(const Function& func,
-                                     TokenPosition requested_token_pos,
-                                     TokenPosition last_token_pos,
-                                     intptr_t requested_column,
-                                     TokenPosition exact_token_pos);
+  // IsolateGroupDebugger::
   void DeoptimizeWorld();
   void NotifySingleStepping(bool value) const;
   BreakpointLocation* SetCodeBreakpoints(const Script& script,
@@ -669,36 +670,6 @@
   void PrintBreakpointsListToJSONArray(BreakpointLocation* sbpt,
                                        JSONArray* jsarr) const;
 
-  ActivationFrame* TopDartFrame() const;
-  static ActivationFrame* CollectDartFrame(
-      Isolate* isolate,
-      uword pc,
-      StackFrame* frame,
-      const Code& code,
-      const Array& deopt_frame,
-      intptr_t deopt_frame_offset,
-      ActivationFrame::Kind kind = ActivationFrame::kRegular);
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  static ArrayPtr DeoptimizeToArray(Thread* thread,
-                                    StackFrame* frame,
-                                    const Code& code);
-  TokenPosition FindExactTokenPosition(const Script& script,
-                                       TokenPosition start_of_line,
-                                       intptr_t column_number);
-#endif
-  // Appends at least one stack frame. Multiple frames will be appended
-  // if |code| at the frame's pc contains inlined functions.
-  static void AppendCodeFrames(Thread* thread,
-                               Isolate* isolate,
-                               Zone* zone,
-                               DebuggerStackTrace* stack_trace,
-                               StackFrame* frame,
-                               Code* code,
-                               Code* inlined_code,
-                               Array* deopt_frame);
-  static DebuggerStackTrace* CollectStackTrace();
-  static DebuggerStackTrace* CollectAsyncCausalStackTrace();
-  static DebuggerStackTrace* CollectAsyncLazyStackTrace();
   void SignalPausedEvent(ActivationFrame* top_frame, Breakpoint* bpt);
 
   intptr_t nextId() { return next_id_++; }
@@ -718,9 +689,6 @@
                         DebuggerStackTrace* awaiter_stack_trace);
   void ClearCachedStackTraces();
 
-  // Can we rewind to the indicated frame?
-  bool CanRewindFrame(intptr_t frame_index, const char** error) const;
-
   void RewindToFrame(intptr_t frame_index);
   void RewindToUnoptimizedFrame(StackFrame* frame, const Code& code);
   void RewindToOptimizedFrame(StackFrame* frame,
diff --git a/runtime/vm/debugger_api_impl_test.cc b/runtime/vm/debugger_api_impl_test.cc
index 7d9d0ab..965764b 100644
--- a/runtime/vm/debugger_api_impl_test.cc
+++ b/runtime/vm/debugger_api_impl_test.cc
@@ -88,8 +88,7 @@
   Isolate* I = T->isolate();
   CHECK_DEBUGGER(I);
   CHECK_NOT_NULL(trace);
-  *trace =
-      reinterpret_cast<Dart_StackTrace>(I->debugger()->CurrentStackTrace());
+  *trace = reinterpret_cast<Dart_StackTrace>(DebuggerStackTrace::Collect());
   return Api::Success();
 }
 
@@ -106,9 +105,8 @@
     if (dart_stacktrace.IsNull()) {
       *trace = NULL;
     } else {
-      Isolate* I = T->isolate();
       *trace = reinterpret_cast<Dart_StackTrace>(
-          I->debugger()->StackTraceFrom(dart_stacktrace));
+          DebuggerStackTrace::From(dart_stacktrace));
     }
     return Api::Success();
   } else {
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 33d8942..8b81dc7 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -10800,6 +10800,8 @@
   friend class Class;
 };
 
+class DebuggerStackTrace;
+
 // Internal stacktrace object used in exceptions for printing stack traces.
 class StackTrace : public Instance {
  public:
@@ -10856,7 +10858,7 @@
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(StackTrace, Instance);
   friend class Class;
-  friend class Debugger;
+  friend class DebuggerStackTrace;
 };
 
 class RegExpFlags {
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index 849bf2f..c54e46f 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -2607,7 +2607,7 @@
       }
     }
     if (FLAG_stress_async_stacks) {
-      isolate->debugger()->CollectAwaiterReturnStackTrace();
+      DebuggerStackTrace::CollectAwaiterReturn();
     }
   }
   if (do_gc) {
diff --git a/tools/VERSION b/tools/VERSION
index 9546ef0..fa1d5b6 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 13
 PATCH 0
-PRERELEASE 65
+PRERELEASE 66
 PRERELEASE_PATCH 0
\ No newline at end of file
