diff --git a/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart b/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart
index cb04456..add033d 100644
--- a/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart
+++ b/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart
@@ -2,7 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'package:front_end/src/api_unstable/dart2js.dart' as api;
 import 'package:kernel/ast.dart';
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
@@ -13,7 +12,6 @@
 /// Replaces js_util methods with inline calls to foreign_helper JS which
 /// emits the code as a JavaScript code fragment.
 class JsUtilOptimizer extends Transformer {
-  final Procedure _jsTarget;
   final Procedure _callMethodTarget;
   final List<Procedure> _callMethodUncheckedTargets;
   final Procedure _callConstructorTarget;
@@ -32,16 +30,16 @@
     'setProperty'
   ];
   final Iterable<Procedure> _allowedInteropJsUtilTargets;
+  final Procedure _jsTarget;
   final Procedure _allowInteropTarget;
   final Procedure _listEmptyFactory;
 
   final CoreTypes _coreTypes;
   final StatefulStaticTypeContext _staticTypeContext;
+  Map<Reference, ExtensionMemberDescriptor>? _extensionMemberIndex;
 
   JsUtilOptimizer(this._coreTypes, ClassHierarchy hierarchy)
-      : _jsTarget =
-            _coreTypes.index.getTopLevelProcedure('dart:_foreign_helper', 'JS'),
-        _callMethodTarget =
+      : _callMethodTarget =
             _coreTypes.index.getTopLevelProcedure('dart:js_util', 'callMethod'),
         _callMethodUncheckedTargets = List<Procedure>.generate(
             5,
@@ -59,6 +57,8 @@
             .getTopLevelProcedure('dart:js_util', 'setProperty'),
         _setPropertyUncheckedTarget = _coreTypes.index
             .getTopLevelProcedure('dart:js_util', '_setPropertyUnchecked'),
+        _jsTarget =
+            _coreTypes.index.getTopLevelProcedure('dart:_foreign_helper', 'JS'),
         _allowInteropTarget =
             _coreTypes.index.getTopLevelProcedure('dart:js', 'allowInterop'),
         _allowedInteropJsUtilTargets = _allowedInteropJsUtilMembers.map(
@@ -74,6 +74,7 @@
     _staticTypeContext.enterLibrary(lib);
     lib.transformChildren(this);
     _staticTypeContext.leaveLibrary(lib);
+    _extensionMemberIndex = null;
     return lib;
   }
 
@@ -88,21 +89,24 @@
   @override
   visitProcedure(Procedure node) {
     _staticTypeContext.enterMember(node);
-    if (node.isExternal && node.isExtensionMember && !_isDeclaredStatic(node)) {
-      var transformedBody;
-      if (api.getExtensionMemberKind(node) == ProcedureKind.Getter) {
-        transformedBody = _getExternalGetterBody(node);
-      } else if (api.getExtensionMemberKind(node) == ProcedureKind.Setter) {
-        transformedBody = _getExternalSetterBody(node);
-      } else if (api.getExtensionMemberKind(node) == ProcedureKind.Method) {
-        transformedBody = _getExternalMethodBody(node);
+    var transformedBody;
+    if (node.isExternal && node.isExtensionMember) {
+      var index = _extensionMemberIndex ??=
+          _createExtensionMembersIndex(node.enclosingLibrary);
+      var nodeDescriptor = index[node.reference]!;
+      if (!nodeDescriptor.isStatic) {
+        if (nodeDescriptor.kind == ExtensionMemberKind.Getter) {
+          transformedBody = _getExternalGetterBody(node);
+        } else if (nodeDescriptor.kind == ExtensionMemberKind.Setter) {
+          transformedBody = _getExternalSetterBody(node);
+        } else if (nodeDescriptor.kind == ExtensionMemberKind.Method) {
+          transformedBody = _getExternalMethodBody(node);
+        }
       }
-      // TODO(rileyporter): Add transformation for static members and any
-      // operators we decide to support.
-      if (transformedBody != null) {
-        node.function.body = transformedBody;
-        node.isExternal = false;
-      }
+    }
+    if (transformedBody != null) {
+      node.function.body = transformedBody;
+      node.isExternal = false;
     } else {
       node.transformChildren(this);
     }
@@ -110,6 +114,18 @@
     return node;
   }
 
+  /// Returns and initializes `_extensionMemberIndex` to an index of the member
+  /// reference to the member `ExtensionMemberDescriptor`, for all extension
+  /// members in the given [library].
+  Map<Reference, ExtensionMemberDescriptor> _createExtensionMembersIndex(
+      Library library) {
+    _extensionMemberIndex = {};
+    library.extensions.forEach((extension) => extension.members.forEach(
+        (descriptor) =>
+            _extensionMemberIndex![descriptor.member] = descriptor));
+    return _extensionMemberIndex!;
+  }
+
   /// Returns a new function body for the given [node] external getter.
   ///
   /// The new function body will call the optimized version of
@@ -121,11 +137,11 @@
         _getPropertyTarget,
         Arguments([
           VariableGet(function.positionalParameters.first),
-          StringLiteral(_getMemberName(node))
+          StringLiteral(_getExtensionMemberName(node))
         ]))
       ..fileOffset = node.fileOffset;
-    return ReturnStatement(AsExpression(
-        _lowerGetProperty(getPropertyInvocation), function.returnType));
+    return ReturnStatement(
+        AsExpression(getPropertyInvocation, function.returnType));
   }
 
   /// Returns a new function body for the given [node] external setter.
@@ -139,7 +155,7 @@
         _setPropertyTarget,
         Arguments([
           VariableGet(function.positionalParameters.first),
-          StringLiteral(_getMemberName(node)),
+          StringLiteral(_getExtensionMemberName(node)),
           VariableGet(function.positionalParameters.last)
         ]))
       ..fileOffset = node.fileOffset;
@@ -157,7 +173,7 @@
         _callMethodTarget,
         Arguments([
           VariableGet(function.positionalParameters.first),
-          StringLiteral(_getMemberName(node)),
+          StringLiteral(_getExtensionMemberName(node)),
           ListLiteral(function.positionalParameters
               .sublist(1)
               .map((argument) => VariableGet(argument))
@@ -168,43 +184,30 @@
         _lowerCallMethod(callMethodInvocation), function.returnType));
   }
 
-  /// Returns the member name, either from the `@JS` annotation if non-empty,
-  /// or parsed from CFE generated node name.
-  String _getMemberName(Procedure node) {
+  /// Returns the extension member name.
+  ///
+  /// Returns either the name from the `@JS` annotation if non-empty, or the
+  /// declared name of the extension member. Does not return the CFE generated
+  /// name for the top level member for this extension member.
+  String _getExtensionMemberName(Procedure node) {
     var jsAnnotationName = getJSName(node);
     if (jsAnnotationName.isNotEmpty) {
       return jsAnnotationName;
     }
-    // TODO(rileyporter): Switch to using the ExtensionMemberDescriptor data.
-    var nodeName = node.name.text;
-    if (nodeName.contains('#')) {
-      return nodeName.substring(nodeName.indexOf('#') + 1);
-    } else {
-      return nodeName.substring(nodeName.indexOf('|') + 1);
-    }
-  }
-
-  /// Returns whether the given extension [node] is declared as `static`.
-  ///
-  /// All extension members have `isStatic` true, but the members declared as
-  /// static will not have a synthesized `this` variable.
-  bool _isDeclaredStatic(Procedure node) {
-    return node.function.positionalParameters.isEmpty ||
-        node.function.positionalParameters.first.name != '#this';
+    return _extensionMemberIndex![node.reference]!.name.text;
   }
 
   /// Replaces js_util method calls with optimization when possible.
   ///
-  /// Lowers `getProperty` for any argument type straight to JS fragment call.
-  /// Lowers `setProperty` to `_setPropertyUnchecked` for values that are
+  /// Lowers `setProperty` to  `_setPropertyUnchecked` for values that are
   /// not Function type and guaranteed to be interop allowed.
   /// Lowers `callMethod` to `_callMethodUncheckedN` when the number of given
   /// arguments is 0-4 and all arguments are guaranteed to be interop allowed.
+  /// Lowers `callConstructor` to `_callConstructorUncheckedN` when there are
+  /// 0-4 arguments and all arguments are guaranteed to be interop allowed.
   @override
   visitStaticInvocation(StaticInvocation node) {
-    if (node.target == _getPropertyTarget) {
-      node = _lowerGetProperty(node);
-    } else if (node.target == _setPropertyTarget) {
+    if (node.target == _setPropertyTarget) {
       node = _lowerSetProperty(node);
     } else if (node.target == _callMethodTarget) {
       node = _lowerCallMethod(node);
@@ -215,28 +218,6 @@
     return node;
   }
 
-  /// Lowers the given js_util `getProperty` call to the foreign_helper JS call
-  /// for any argument type. Lowers `getProperty(o, name)` to
-  /// `JS('Object|Null', '#.#', o, name)`.
-  StaticInvocation _lowerGetProperty(StaticInvocation node) {
-    Arguments arguments = node.arguments;
-    assert(arguments.types.isEmpty);
-    assert(arguments.positional.length == 2);
-    assert(arguments.named.isEmpty);
-    return StaticInvocation(
-        _jsTarget,
-        Arguments(
-          [
-            StringLiteral("Object|Null"),
-            StringLiteral("#.#"),
-            ...arguments.positional
-          ],
-          // TODO(rileyporter): Copy type from getProperty when it's generic.
-          types: [DynamicType()],
-        )..fileOffset = arguments.fileOffset)
-      ..fileOffset = node.fileOffset;
-  }
-
   /// Lowers the given js_util `setProperty` call to `_setPropertyUnchecked`
   /// when the additional validation checks in `setProperty` can be elided.
   ///
diff --git a/pkg/_js_interop_checks/pubspec.yaml b/pkg/_js_interop_checks/pubspec.yaml
index 27f50f2..bae1992 100644
--- a/pkg/_js_interop_checks/pubspec.yaml
+++ b/pkg/_js_interop_checks/pubspec.yaml
@@ -8,7 +8,5 @@
 dependencies:
   _fe_analyzer_shared:
     path: ../_fe_analyzer_shared
-  front_end:
-    path: ../front_end
   kernel:
     path: ../kernel
diff --git a/pkg/analysis_server/lib/src/services/refactoring/move_file.dart b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
index 456dc38..6e97072 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/move_file.dart
@@ -8,10 +8,8 @@
 import 'package:analysis_server/src/services/refactoring/refactoring_internal.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
-import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
@@ -179,11 +177,8 @@
   }
 
   bool _isPackageReference(SourceReference reference) {
-    var unitSourceContent = reference.element.unitSourceContent;
-    if (unitSourceContent == null) {
-      return false;
-    }
-    var quotedImportUri = unitSourceContent.substring(reference.range.offset,
+    var source = reference.element.source!;
+    var quotedImportUri = source.contents.data.substring(reference.range.offset,
         reference.range.offset + reference.range.length);
     return packagePrefixedStringPattern.hasMatch(quotedImportUri);
   }
@@ -220,10 +215,3 @@
     }
   }
 }
-
-extension on Element {
-  String? get unitSourceContent {
-    var unitElement = thisOrAncestorOfType<CompilationUnitElementImpl>();
-    return unitElement?.sourceContent;
-  }
-}
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 670e73a..fcf5d4e 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -80,7 +80,7 @@
 /// TODO(scheglov) Clean up the list of implicitly analyzed files.
 class AnalysisDriver implements AnalysisDriverGeneric {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 179;
+  static const int DATA_VERSION = 180;
 
   /// The number of exception contexts allowed to write. Once this field is
   /// zero, we stop writing any new exception contexts in this process.
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 9c3a24d..766ace4 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -974,10 +974,6 @@
   @override
   late Source source;
 
-  /// The content of the [source] for which this element model was built.
-  /// Might be `null` if we don't have it (for example in google3 summaries).
-  String? sourceContent;
-
   @override
   LineInfo? lineInfo;
 
diff --git a/pkg/analyzer/lib/src/generated/declaration_resolver.dart b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
index 570ef8f..650fde4 100644
--- a/pkg/analyzer/lib/src/generated/declaration_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
@@ -107,16 +107,6 @@
             (element.aliasedElement as GenericFunctionTypeElement).parameters,
         _typeParameters = element.typeParameters;
 
-  String? get _unitSourceContent {
-    Element? element = this.element;
-    while (element != null) {
-      if (element is CompilationUnitElementImpl) {
-        return element.sourceContent;
-      }
-      element = element.enclosingElement;
-    }
-  }
-
   void consumeLocalElements() {
     _functionIndex = _functions!.length;
   }
@@ -138,8 +128,7 @@
         '[accessors: $accessors]'
         '[element.source: ${element.source?.fullName}]'
         '[libraryFilePath: $libraryFilePath]'
-        '[unitFilePath: $unitFilePath]'
-        '[unitSourceContent: $_unitSourceContent]',
+        '[unitFilePath: $unitFilePath]',
       );
     }
     return _accessors![_accessorIndex++] as PropertyAccessorElementImpl;
@@ -158,8 +147,7 @@
         '[classes: $classes]'
         '[element.source: ${element.source?.fullName}]'
         '[libraryFilePath: $libraryFilePath]'
-        '[unitFilePath: $unitFilePath]'
-        '[unitSourceContent: $_unitSourceContent]',
+        '[unitFilePath: $unitFilePath]',
       );
     }
     return _classes![_classIndex++] as ClassElementImpl;
@@ -215,8 +203,7 @@
         '[variables: $variables]'
         '[element.source: ${element.source?.fullName}]'
         '[libraryFilePath: $libraryFilePath]'
-        '[unitFilePath: $unitFilePath]'
-        '[unitSourceContent: $_unitSourceContent]',
+        '[unitFilePath: $unitFilePath]',
       );
     }
     return _variables![_variableIndex++] as VariableElementImpl;
diff --git a/pkg/analyzer/lib/src/summary2/bundle_reader.dart b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
index 8767463..2b75f9e 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
@@ -1266,7 +1266,6 @@
 
     unitElement.uri = _reader.readOptionalStringReference();
     unitElement.isSynthetic = _reader.readBool();
-    unitElement.sourceContent = _reader.readOptionalStringUtf8();
 
     _readUnitMacroGenerationDataList(unitElement);
     _readClasses(unitElement, unitReference);
diff --git a/pkg/analyzer/lib/src/summary2/bundle_writer.dart b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
index 3103c35..33e913e 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
@@ -449,7 +449,6 @@
     _sink._writeStringReference('${unitElement.source.uri}');
     _sink._writeOptionalStringReference(unitElement.uri);
     _sink.writeBool(unitElement.isSynthetic);
-    _sink.writeOptionalStringUtf8(unitElement.sourceContent);
     _resolutionSink._writeAnnotationList(unitElement.metadata);
     _writeUnitElementMacroGenerationDataList(unitElement);
     _writeList(unitElement.classes, _writeClassElement);
diff --git a/pkg/analyzer/lib/src/summary2/library_builder.dart b/pkg/analyzer/lib/src/summary2/library_builder.dart
index 10620eb..fc66eed 100644
--- a/pkg/analyzer/lib/src/summary2/library_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/library_builder.dart
@@ -415,7 +415,6 @@
       unitElement.librarySource = inputLibrary.source;
       unitElement.lineInfo = unitNode.lineInfo;
       unitElement.source = inputUnit.source;
-      unitElement.sourceContent = inputUnit.sourceContent;
       unitElement.uri = inputUnit.partUriStr;
       unitElement.setCodeRange(0, unitNode.length);
 
diff --git a/pkg/dartdev/lib/src/commands/compile.dart b/pkg/dartdev/lib/src/commands/compile.dart
index 6c3269d..140b083 100644
--- a/pkg/dartdev/lib/src/commands/compile.dart
+++ b/pkg/dartdev/lib/src/commands/compile.dart
@@ -261,6 +261,13 @@
         !Sdk.checkArtifactExists(genSnapshot)) {
       return 255;
     }
+    // AOT compilation isn't supported on ia32. Currently, generating an
+    // executable only supports AOT runtimes, so these commands are disabled.
+    if (Platform.version.contains('ia32')) {
+      stderr.write(
+          "'dart compile $format' is not supported on x86 architectures");
+      return 64;
+    }
     // We expect a single rest argument; the dart entry point.
     if (argResults.rest.length != 1) {
       // This throws.
diff --git a/pkg/dartdev/test/commands/compile_test.dart b/pkg/dartdev/test/commands/compile_test.dart
index 4bf62f0..be43ac7 100644
--- a/pkg/dartdev/test/commands/compile_test.dart
+++ b/pkg/dartdev/test/commands/compile_test.dart
@@ -20,6 +20,7 @@
     'Info: Compiling without sound null safety';
 
 void defineCompileTests() {
+  final isRunningOnIA32 = Platform.version.contains('ia32');
   // *** NOTE ***: These tests *must* be run with the `--use-sdk` option
   // as they depend on a fully built SDK to resolve various snapshot files
   // used by compilation.
@@ -51,6 +52,12 @@
         'Usage: dart compile <subcommand> [arguments]',
       ),
     );
+
+    expect(result.stdout, contains('jit-snapshot'));
+    expect(result.stdout, contains('kernel'));
+    expect(result.stdout, contains('js'));
+    expect(result.stdout, contains('aot-snapshot'));
+    expect(result.stdout, contains('exe'));
     expect(result.exitCode, 0);
   });
 
@@ -118,7 +125,41 @@
     expect(result.stdout, contains('I love executables'));
     expect(result.stderr, isEmpty);
     expect(result.exitCode, 0);
-  });
+  }, skip: isRunningOnIA32);
+
+  test('Compile to executable disabled on IA32', () {
+    final p = project(mainSrc: 'void main() { print("I love executables"); }');
+    final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
+
+    var result = p.runSync(
+      [
+        'compile',
+        'exe',
+        inFile,
+      ],
+    );
+
+    expect(result.stderr,
+        "'dart compile exe' is not supported on x86 architectures");
+    expect(result.exitCode, 64);
+  }, skip: !isRunningOnIA32);
+
+  test('Compile to AOT snapshot disabled on IA32', () {
+    final p = project(mainSrc: 'void main() { print("I love executables"); }');
+    final inFile = path.canonicalize(path.join(p.dirPath, p.relativeFilePath));
+
+    var result = p.runSync(
+      [
+        'compile',
+        'aot-snapshot',
+        inFile,
+      ],
+    );
+
+    expect(result.stderr,
+        "'dart compile aot-snapshot' is not supported on x86 architectures");
+    expect(result.exitCode, 64);
+  }, skip: !isRunningOnIA32);
 
   test('Compile and run executable with options', () {
     final p = project(
@@ -151,7 +192,7 @@
     expect(result.stdout, contains('42'));
     expect(result.stderr, isEmpty);
     expect(result.exitCode, 0);
-  });
+  }, skip: isRunningOnIA32);
 
   test('Compile and run aot snapshot', () {
     final p = project(mainSrc: 'void main() { print("I love AOT"); }');
@@ -182,7 +223,7 @@
     expect(result.stdout, contains('I love AOT'));
     expect(result.stderr, isEmpty);
     expect(result.exitCode, 0);
-  });
+  }, skip: isRunningOnIA32);
 
   test('Compile and run kernel snapshot', () {
     final p = project(mainSrc: 'void main() { print("I love kernel"); }');
@@ -266,7 +307,7 @@
     expect(result.exitCode, compileErrorExitCode);
     expect(File(outFile).existsSync(), false,
         reason: 'File not found: $outFile');
-  });
+  }, skip: isRunningOnIA32);
 
   test('Compile exe with warnings', () {
     final p = project(mainSrc: '''
@@ -293,7 +334,7 @@
     expect(result.exitCode, 0);
     expect(File(outFile).existsSync(), true,
         reason: 'File not found: $outFile');
-  });
+  }, skip: isRunningOnIA32);
 
   test('Compile exe with sound null safety', () {
     final p = project(mainSrc: '''void main() {}''');
@@ -315,7 +356,7 @@
     expect(result.exitCode, 0);
     expect(File(outFile).existsSync(), true,
         reason: 'File not found: $outFile');
-  });
+  }, skip: isRunningOnIA32);
 
   test('Compile exe with unsound null safety', () {
     final p = project(mainSrc: '''
@@ -340,7 +381,7 @@
     expect(result.exitCode, 0);
     expect(File(outFile).existsSync(), true,
         reason: 'File not found: $outFile');
-  });
+  }, skip: isRunningOnIA32);
 
   test('Compile and run exe with --sound-null-safety', () {
     final p = project(mainSrc: '''void main() {
@@ -374,7 +415,7 @@
     expect(result.stdout, contains('sound'));
     expect(result.stderr, isEmpty);
     expect(result.exitCode, 0);
-  });
+  }, skip: isRunningOnIA32);
 
   test('Compile and run exe with --no-sound-null-safety', () {
     final p = project(mainSrc: '''void main() {
@@ -408,7 +449,7 @@
     expect(result.stdout, contains('unsound'));
     expect(result.stderr, isEmpty);
     expect(result.exitCode, 0);
-  });
+  }, skip: isRunningOnIA32);
 
   test('Compile exe without info', () {
     final p = project(mainSrc: '''void main() {}''');
@@ -432,7 +473,7 @@
     expect(result.exitCode, 0);
     expect(File(outFile).existsSync(), true,
         reason: 'File not found: $outFile');
-  });
+  }, skip: isRunningOnIA32);
 
   test('Compile exe without warnings', () {
     final p = project(mainSrc: '''
@@ -459,7 +500,7 @@
         predicate((o) => !'$o'.contains(soundNullSafetyMessage)));
     expect(result.stderr, isEmpty);
     expect(result.exitCode, 0);
-  });
+  }, skip: isRunningOnIA32);
 
   test('Compile JS with sound null safety', () {
     final p = project(mainSrc: '''void main() {}''');
@@ -579,7 +620,7 @@
     expect(result.exitCode, 0);
     expect(File(outFile).existsSync(), true,
         reason: 'File not found: $outFile');
-  });
+  }, skip: isRunningOnIA32);
 
   test('Compile AOT snapshot with unsound null safety', () {
     final p = project(mainSrc: '''
@@ -604,7 +645,7 @@
     expect(result.exitCode, 0);
     expect(File(outFile).existsSync(), true,
         reason: 'File not found: $outFile');
-  });
+  }, skip: isRunningOnIA32);
 
   test('Compile AOT snapshot without info', () {
     final p = project(mainSrc: '''void main() {}''');
@@ -628,7 +669,7 @@
     expect(result.exitCode, 0);
     expect(File(outFile).existsSync(), true,
         reason: 'File not found: $outFile');
-  });
+  }, skip: isRunningOnIA32);
 
   test('Compile AOT snapshot without warnings', () {
     final p = project(mainSrc: '''
@@ -655,7 +696,7 @@
         predicate((o) => !'$o'.contains(soundNullSafetyMessage)));
     expect(result.stderr, isEmpty);
     expect(result.exitCode, 0);
-  });
+  }, skip: isRunningOnIA32);
 
   test('Compile AOT snapshot with warnings', () {
     final p = project(mainSrc: '''
@@ -683,7 +724,7 @@
     expect(result.stdout, contains('Warning: '));
     expect(result.stderr, isEmpty);
     expect(result.exitCode, 0);
-  });
+  }, skip: isRunningOnIA32);
 
   test('Compile kernel with invalid trailing argument', () {
     final p = project(mainSrc: '''void main() {}''');
diff --git a/pkg/front_end/lib/src/api_unstable/dart2js.dart b/pkg/front_end/lib/src/api_unstable/dart2js.dart
index b8d1d74..e811ba1 100644
--- a/pkg/front_end/lib/src/api_unstable/dart2js.dart
+++ b/pkg/front_end/lib/src/api_unstable/dart2js.dart
@@ -241,23 +241,3 @@
 // TODO(sigmund): Delete this API once `member.isRedirectingFactory`
 // is implemented correctly for patch files (Issue #33495).
 bool isRedirectingFactory(ir.Procedure member) => member.isRedirectingFactory;
-
-/// Determines what `ProcedureKind` the given extension [member] is based on
-/// the member name.
-///
-/// Note: classifies operators as `ProcedureKind.Method`.
-ir.ProcedureKind getExtensionMemberKind(ir.Procedure member) {
-  assert(member.isExtensionMember);
-  String name = member.name.text;
-  int pipeIndex = name.indexOf('|');
-  int poundIndex = name.indexOf('#');
-  assert(pipeIndex >= 0);
-  if (poundIndex >= 0) {
-    String getOrSet = name.substring(pipeIndex + 1, poundIndex);
-    return getOrSet == 'get'
-        ? ir.ProcedureKind.Getter
-        : ir.ProcedureKind.Setter;
-  } else {
-    return member.kind;
-  }
-}
diff --git a/pkg/front_end/test/desugar_test.dart b/pkg/front_end/test/desugar_test.dart
index 31089ed..82fdd4a 100644
--- a/pkg/front_end/test/desugar_test.dart
+++ b/pkg/front_end/test/desugar_test.dart
@@ -28,7 +28,6 @@
     await testRedirectingFactoryDirect();
     await testRedirectingFactorySerialized();
     await testRedirectingFactoryPatchFile();
-    await testExtensionMemberKind();
   });
 }
 
@@ -80,97 +79,3 @@
   _B(int x);
 }
 ''';
-
-Future<void> testExtensionMemberKind() async {
-  var component = await compileUnit(['e.dart'], {'e.dart': extensionSource});
-  var library = component.libraries
-      .firstWhere((l) => l.importUri.path.endsWith('e.dart'));
-  var descriptors =
-      library.extensions.expand((extension) => extension.members).toList();
-
-  // Check generated getters and setters for fields.
-  var fieldGetter =
-      findExtensionField(descriptors, 'field', ir.ExtensionMemberKind.Getter);
-  Expect.equals(
-      api.getExtensionMemberKind(fieldGetter), ir.ProcedureKind.Getter);
-  var fieldSetter =
-      findExtensionField(descriptors, 'field', ir.ExtensionMemberKind.Setter);
-  Expect.equals(
-      api.getExtensionMemberKind(fieldSetter), ir.ProcedureKind.Setter);
-  var staticFieldGetter = findExtensionField(
-      descriptors, 'staticField', ir.ExtensionMemberKind.Getter);
-  Expect.equals(
-      api.getExtensionMemberKind(staticFieldGetter), ir.ProcedureKind.Getter);
-  var staticFieldSetter = findExtensionField(
-      descriptors, 'staticField', ir.ExtensionMemberKind.Setter);
-  Expect.equals(
-      api.getExtensionMemberKind(staticFieldSetter), ir.ProcedureKind.Setter);
-
-  // Check getters and setters.
-  var getter = findExtensionMember(descriptors, 'getter');
-  Expect.equals(api.getExtensionMemberKind(getter), ir.ProcedureKind.Getter);
-  var setter = findExtensionMember(descriptors, 'setter');
-  Expect.equals(api.getExtensionMemberKind(setter), ir.ProcedureKind.Setter);
-  var staticGetter = findExtensionMember(descriptors, 'staticGetter');
-  Expect.equals(
-      api.getExtensionMemberKind(staticGetter), ir.ProcedureKind.Getter);
-  var staticSetter = findExtensionMember(descriptors, 'staticSetter');
-  Expect.equals(
-      api.getExtensionMemberKind(staticSetter), ir.ProcedureKind.Setter);
-
-  // Check methods.
-  var method = findExtensionMember(descriptors, 'method');
-  Expect.equals(api.getExtensionMemberKind(method), ir.ProcedureKind.Method);
-  var methodTearoff = findExtensionTearoff(descriptors, 'get#method');
-  Expect.equals(
-      api.getExtensionMemberKind(methodTearoff), ir.ProcedureKind.Getter);
-  var staticMethod = findExtensionMember(descriptors, 'staticMethod');
-  Expect.equals(
-      api.getExtensionMemberKind(staticMethod), ir.ProcedureKind.Method);
-
-  // Check operators.
-  var operator = findExtensionMember(descriptors, '+');
-  Expect.equals(api.getExtensionMemberKind(operator), ir.ProcedureKind.Method);
-}
-
-ir.Member findExtensionMember(
-    List<ir.ExtensionMemberDescriptor> descriptors, String memberName) {
-  return descriptors
-      .firstWhere((d) => d.name.text == memberName)
-      .member
-      .asMember;
-}
-
-ir.Member findExtensionField(List<ir.ExtensionMemberDescriptor> descriptors,
-    String fieldName, ir.ExtensionMemberKind kind) {
-  return descriptors
-      .firstWhere((d) => d.name.text == fieldName && d.kind == kind)
-      .member
-      .asMember;
-}
-
-ir.Member findExtensionTearoff(
-    List<ir.ExtensionMemberDescriptor> descriptors, String memberName) {
-  return descriptors
-      .map((d) => d.member.asMember)
-      .firstWhere((m) => m.name.text.contains(memberName));
-}
-
-const extensionSource = '''
-class Foo {}
-
-extension Ext on Foo {
-  external int field;
-  external static int staticField;
-
-  external get getter;
-  external set setter(_);
-  external static get staticGetter;
-  external static set staticSetter(_);
-
-  external int method();
-  external static int staticMethod();
-
-  external operator +(_);
-}
-''';
diff --git a/runtime/observatory/tests/service/break_on_dart_colon_test.dart b/runtime/observatory/tests/service/break_on_dart_colon_test.dart
new file mode 100644
index 0000000..f9b4908
--- /dev/null
+++ b/runtime/observatory/tests/service/break_on_dart_colon_test.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// VMOptions=--verbose_debug
+
+import 'dart:developer';
+
+import 'package:observatory/service_io.dart';
+
+import 'service_test_common.dart';
+import 'test_helper.dart';
+
+// Line in core/print.dart
+const int LINE_A = 10;
+
+testMain() {
+  debugger();
+  print('1');
+  print('2');
+  print('3');
+  print('Done');
+}
+
+IsolateTest expectHitBreakpoint(String uri, int line) {
+  return (Isolate isolate) async {
+    final bpt = await isolate.addBreakpointByScriptUri(uri, line);
+    await resumeIsolate(isolate);
+    await hasStoppedAtBreakpoint(isolate);
+    await stoppedAtLine(line)(isolate);
+    await isolate.removeBreakpoint(bpt);
+  };
+}
+
+var tests = <IsolateTest>[
+  hasStoppedAtBreakpoint,
+
+  // Dart libraries are not debuggable by default
+  markDartColonLibrariesDebuggable,
+
+  expectHitBreakpoint('org-dartlang-sdk:///sdk/lib/core/print.dart', LINE_A),
+  expectHitBreakpoint('dart:core/print.dart', LINE_A),
+  expectHitBreakpoint('/core/print.dart', LINE_A),
+
+  resumeIsolate,
+];
+
+main(args) => runIsolateTests(args, tests, testeeConcurrent: testMain);
diff --git a/runtime/observatory/tests/service/service_kernel.status b/runtime/observatory/tests/service/service_kernel.status
index e5f8df6..af626d9 100644
--- a/runtime/observatory/tests/service/service_kernel.status
+++ b/runtime/observatory/tests/service/service_kernel.status
@@ -47,6 +47,7 @@
 bad_reload_test: SkipByDesign # Hot reload is disabled in AOT mode.
 break_on_activation_test: SkipByDesign # Debugger is disabled in AOT mode.
 break_on_async_function_test: SkipByDesign # Debugger is disabled in AOT mode.
+break_on_dart_colon_test: SkipByDesign # Debugger is disabled in AOT mode.
 break_on_default_constructor_test: SkipByDesign # Debugger is disabled in AOT mode.
 break_on_function_child_isolate_test: SkipByDesign # Debugger is disabled in AOT mode.
 break_on_function_many_child_isolates_test: SkipByDesign # Debugger is disabled in AOT mode.
diff --git a/runtime/observatory_2/tests/service_2/break_on_dart_colon_test.dart b/runtime/observatory_2/tests/service_2/break_on_dart_colon_test.dart
new file mode 100644
index 0000000..e0d400c3
--- /dev/null
+++ b/runtime/observatory_2/tests/service_2/break_on_dart_colon_test.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// VMOptions=--verbose_debug
+
+import 'dart:developer';
+
+import 'package:observatory_2/service_io.dart';
+
+import 'service_test_common.dart';
+import 'test_helper.dart';
+
+// Line in core/print.dart
+const int LINE_A = 10;
+
+testMain() {
+  debugger();
+  print('1');
+  print('2');
+  print('3');
+  print('Done');
+}
+
+IsolateTest expectHitBreakpoint(String uri, int line) {
+  return (Isolate isolate) async {
+    final bpt = await isolate.addBreakpointByScriptUri(uri, line);
+    await resumeIsolate(isolate);
+    await hasStoppedAtBreakpoint(isolate);
+    await stoppedAtLine(line)(isolate);
+    await isolate.removeBreakpoint(bpt);
+  };
+}
+
+var tests = <IsolateTest>[
+  hasStoppedAtBreakpoint,
+
+  // Dart libraries are not debuggable by default
+  markDartColonLibrariesDebuggable,
+
+  expectHitBreakpoint('org-dartlang-sdk:///sdk/lib/core/print.dart', LINE_A),
+  expectHitBreakpoint('dart:core/print.dart', LINE_A),
+  expectHitBreakpoint('/core/print.dart', LINE_A),
+
+  resumeIsolate,
+];
+
+main(args) => runIsolateTests(args, tests, testeeConcurrent: testMain);
diff --git a/runtime/observatory_2/tests/service_2/service_2_kernel.status b/runtime/observatory_2/tests/service_2/service_2_kernel.status
index 5138ddd..322b922 100644
--- a/runtime/observatory_2/tests/service_2/service_2_kernel.status
+++ b/runtime/observatory_2/tests/service_2/service_2_kernel.status
@@ -47,6 +47,7 @@
 bad_reload_test: SkipByDesign # Hot reload is disabled in AOT mode.
 break_on_activation_test: SkipByDesign # Debugger is disabled in AOT mode.
 break_on_async_function_test: SkipByDesign # Debugger is disabled in AOT mode.
+break_on_dart_colon_test: SkipByDesign # Debugger is disabled in AOT mode.
 break_on_default_constructor_test: SkipByDesign # Debugger is disabled in AOT mode.
 break_on_function_child_isolate_test: SkipByDesign # Debugger is disabled in AOT mode.
 break_on_function_many_child_isolates_test: SkipByDesign # Debugger is disabled in AOT mode.
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 7763cc7..7bbf92b 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -3129,6 +3129,7 @@
   const GrowableObjectArray& libs = GrowableObjectArray::Handle(
       isolate_->group()->object_store()->libraries());
   bool is_package = script_url.StartsWith(Symbols::PackageScheme());
+  bool is_dart_colon = script_url.StartsWith(Symbols::DartScheme());
   Script& script_for_lib = Script::Handle(zone);
   for (intptr_t i = 0; i < libs.Length(); i++) {
     lib ^= libs.At(i);
@@ -3136,7 +3137,8 @@
     // are available for look up. When certain script only contains
     // top level functions, scripts could still be loaded correctly.
     lib.EnsureTopLevelClassIsFinalized();
-    script_for_lib = lib.LookupScript(script_url, !is_package);
+    bool useResolvedUri = !is_package && !is_dart_colon;
+    script_for_lib = lib.LookupScript(script_url, useResolvedUri);
     if (!script_for_lib.IsNull()) {
       scripts.Add(script_for_lib);
     }
diff --git a/tools/VERSION b/tools/VERSION
index cb88287..fe63169 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 143
+PRERELEASE 144
 PRERELEASE_PATCH 0
\ No newline at end of file
