diff --git a/DEPS b/DEPS
index 717b59b..d5d5a11 100644
--- a/DEPS
+++ b/DEPS
@@ -114,7 +114,7 @@
   "fixnum_rev": "3bfc2ed1eea7e7acb79ad4f17392f92c816fc5ce",
   "glob_rev": "e10eb2407c58427144004458ef85c9bbf7286e56",
   "html_rev": "f108bce59d136c584969fd24a5006914796cf213",
-  "http_io_rev": "2fa188caf7937e313026557713f7feffedd4978b",
+  "http_io_rev": "405fc79233b4a3d4bb079ebf438bb2caf2f49355",
   "http_multi_server_rev": "34bf7f04b61cce561f47f7f275c2cc811534a05a",
   "http_parser_rev": "9126ee04e77fd8e4e2e6435b503ee4dd708d7ddc",
   "http_rev": "2c9b418f5086f999c150d18172d2eec1f963de7b",
diff --git a/pkg/compiler/lib/src/ir/annotations.dart b/pkg/compiler/lib/src/ir/annotations.dart
index 23918ac..7147656 100644
--- a/pkg/compiler/lib/src/ir/annotations.dart
+++ b/pkg/compiler/lib/src/ir/annotations.dart
@@ -2,12 +2,10 @@
 // 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.
 
-// @dart = 2.10
-
 import 'package:kernel/ast.dart' as ir;
 import 'package:kernel/type_environment.dart' as ir;
 import '../common/names.dart';
-import 'modular.dart';
+import 'modular_migrated.dart';
 
 class IrAnnotationData {
   final Map<ir.Class, String> _nativeClassNames = {};
@@ -25,13 +23,13 @@
       {};
 
   // Returns the text from the `@Native(<text>)` annotation of [node], if any.
-  String getNativeClassName(ir.Class node) => _nativeClassNames[node];
+  String? getNativeClassName(ir.Class node) => _nativeClassNames[node];
 
   // Returns `true` if [node] has a native body, as in `method() native;`.
   bool hasNativeBody(ir.Member node) => _nativeMembers.contains(node);
 
   // Returns the text from the `@JSName(<text>)` annotation of [node], if any.
-  String getNativeMemberName(ir.Member node) => _nativeMemberNames[node];
+  String? getNativeMemberName(ir.Member node) => _nativeMemberNames[node];
 
   // Returns a list of the text from the `@Creates(<text>)` annotation of
   // [node].
@@ -44,18 +42,18 @@
       _returnsAnnotations[node] ?? const [];
 
   // Returns the text from the `@JS(<text>)` annotation of [node], if any.
-  String getJsInteropLibraryName(ir.Library node) =>
+  String? getJsInteropLibraryName(ir.Library node) =>
       _jsInteropLibraryNames[node];
 
   // Returns the text from the `@JS(<text>)` annotation of [node], if any.
-  String getJsInteropClassName(ir.Class node) => _jsInteropClassNames[node];
+  String? getJsInteropClassName(ir.Class node) => _jsInteropClassNames[node];
 
   // Returns `true` if [node] is annotated with `@anonymous`.
   bool isAnonymousJsInteropClass(ir.Class node) =>
       _anonymousJsInteropClasses.contains(node);
 
   // Returns the text from the `@JS(<text>)` annotation of [node], if any.
-  String getJsInteropMemberName(ir.Member node) => _jsInteropMemberNames[node];
+  String? getJsInteropMemberName(ir.Member node) => _jsInteropMemberNames[node];
 
   // Returns a list of the `@pragma('dart2js:<suffix>')` annotations on [node].
   List<PragmaAnnotationData> getMemberPragmaAnnotationData(ir.Member node) =>
@@ -76,7 +74,7 @@
     });
   }
 
-  void forEachJsInteropMember(void Function(ir.Member, String) f) {
+  void forEachJsInteropMember(void Function(ir.Member, String?) f) {
     _jsInteropLibraryNames.forEach((ir.Library library, _) {
       for (ir.Member member in library.members) {
         if (member.isExternal) {
@@ -87,7 +85,7 @@
     _jsInteropClassNames.forEach((ir.Class cls, _) {
       for (ir.Member member in cls.members) {
         if (member is ir.Field) continue;
-        String name = _jsInteropMemberNames[member];
+        String? name = _jsInteropMemberNames[member];
         if (member.isExternal) {
           name ??= member.name.text;
         }
@@ -131,15 +129,15 @@
   void processMember(ir.Member member) {
     ir.StaticTypeContext staticTypeContext = ir.StaticTypeContext(
         member, modularCore.constantEvaluator.typeEnvironment);
-    List<PragmaAnnotationData> pragmaAnnotations;
-    List<String> createsAnnotations;
-    List<String> returnsAnnotations;
+    List<PragmaAnnotationData>? pragmaAnnotations;
+    List<String>? createsAnnotations;
+    List<String>? returnsAnnotations;
     for (ir.Expression annotation in member.annotations) {
       if (annotation is ir.ConstantExpression) {
         ir.Constant constant = modularCore.constantEvaluator
             .evaluate(staticTypeContext, annotation);
 
-        String jsName = _getJsInteropName(constant);
+        String? jsName = _getJsInteropName(constant);
         if (jsName != null) {
           data._jsInteropMemberNames[member] = jsName;
         }
@@ -149,12 +147,12 @@
           data._nativeMembers.add(member);
         }
 
-        String nativeName = _getNativeMemberName(constant);
+        String? nativeName = _getNativeMemberName(constant);
         if (nativeName != null) {
           data._nativeMemberNames[member] = nativeName;
         }
 
-        String creates = _getCreatesAnnotation(constant);
+        String? creates = _getCreatesAnnotation(constant);
         if (creates != null) {
           if (createsAnnotations == null) {
             data._createsAnnotations[member] = createsAnnotations = [];
@@ -162,7 +160,7 @@
           createsAnnotations.add(creates);
         }
 
-        String returns = _getReturnsAnnotation(constant);
+        String? returns = _getReturnsAnnotation(constant);
         if (returns != null) {
           if (returnsAnnotations == null) {
             data._returnsAnnotations[member] = returnsAnnotations = [];
@@ -170,7 +168,7 @@
           returnsAnnotations.add(returns);
         }
 
-        PragmaAnnotationData pragmaAnnotation = _getPragmaAnnotation(constant);
+        PragmaAnnotationData? pragmaAnnotation = _getPragmaAnnotation(constant);
         if (pragmaAnnotation != null) {
           if (pragmaAnnotations == null) {
             data._memberPragmaAnnotations[member] = pragmaAnnotations = [];
@@ -190,7 +188,7 @@
         ir.Constant constant = modularCore.constantEvaluator
             .evaluate(staticTypeContext, annotation);
 
-        String jsName = _getJsInteropName(constant);
+        String? jsName = _getJsInteropName(constant);
         if (jsName != null) {
           data._jsInteropLibraryNames[library] = jsName;
         }
@@ -202,12 +200,12 @@
           ir.Constant constant = modularCore.constantEvaluator
               .evaluate(staticTypeContext, annotation);
 
-          String nativeClassName = _getNativeClassName(constant);
+          String? nativeClassName = _getNativeClassName(constant);
           if (nativeClassName != null) {
             data._nativeClassNames[cls] = nativeClassName;
           }
 
-          String jsName = _getJsInteropName(constant);
+          String? jsName = _getJsInteropName(constant);
           if (jsName != null) {
             data._jsInteropClassNames[cls] = jsName;
           }
@@ -229,7 +227,7 @@
   return data;
 }
 
-String _getNativeClassName(ir.Constant constant) {
+String? _getNativeClassName(ir.Constant constant) {
   if (constant is ir.InstanceConstant) {
     // TODO(johnniwinther): Add an IrCommonElements for these queries; i.e.
     // `commonElements.isNativeAnnotationClass(constant.classNode)`.
@@ -237,7 +235,7 @@
         constant.classNode.enclosingLibrary.importUri == Uris.dart__js_helper) {
       if (constant.fieldValues.length == 1) {
         ir.Constant fieldValue = constant.fieldValues.values.single;
-        String name;
+        String? name;
         if (fieldValue is ir.StringConstant) {
           name = fieldValue.value;
         }
@@ -256,7 +254,7 @@
       constant.classNode.enclosingLibrary.importUri == Uris.dart__internal;
 }
 
-String _getNativeMemberName(ir.Constant constant) {
+String? _getNativeMemberName(ir.Constant constant) {
   if (constant is ir.InstanceConstant &&
       constant.classNode.name == 'JSName' &&
       constant.classNode.enclosingLibrary.importUri == Uris.dart__js_helper) {
@@ -269,7 +267,7 @@
   return null;
 }
 
-String _getCreatesAnnotation(ir.Constant constant) {
+String? _getCreatesAnnotation(ir.Constant constant) {
   if (constant is ir.InstanceConstant &&
       constant.classNode.name == 'Creates' &&
       constant.classNode.enclosingLibrary.importUri == Uris.dart__js_helper) {
@@ -282,7 +280,7 @@
   return null;
 }
 
-String _getReturnsAnnotation(ir.Constant constant) {
+String? _getReturnsAnnotation(ir.Constant constant) {
   if (constant is ir.InstanceConstant &&
       constant.classNode.name == 'Returns' &&
       constant.classNode.enclosingLibrary.importUri == Uris.dart__js_helper) {
@@ -295,7 +293,7 @@
   return null;
 }
 
-String _getJsInteropName(ir.Constant constant) {
+String? _getJsInteropName(ir.Constant constant) {
   if (constant is ir.InstanceConstant &&
       constant.classNode.name == 'JS' &&
       (constant.classNode.enclosingLibrary.importUri == Uris.package_js ||
@@ -335,7 +333,7 @@
   String toString() => 'PragmaAnnotationData($name)';
 }
 
-PragmaAnnotationData _getPragmaAnnotation(ir.Constant constant) {
+PragmaAnnotationData? _getPragmaAnnotation(ir.Constant constant) {
   if (constant is! ir.InstanceConstant) return null;
   ir.InstanceConstant value = constant;
   ir.Class cls = value.classNode;
@@ -347,8 +345,8 @@
       return const PragmaAnnotationData('tryInline');
     }
   } else if (uri == Uris.dart_core && cls.name == 'pragma') {
-    ir.Constant nameValue;
-    ir.Constant optionsValue;
+    ir.Constant? nameValue;
+    ir.Constant? optionsValue;
     value.fieldValues.forEach((ir.Reference reference, ir.Constant fieldValue) {
       ir.Field field = reference.asField;
       if (field.name.text == 'name') {
@@ -357,8 +355,9 @@
         optionsValue = fieldValue;
       }
     });
-    if (nameValue is! ir.StringConstant) return null;
-    ir.StringConstant stringValue = nameValue;
+    final nameValueFinal = nameValue;
+    if (nameValueFinal is! ir.StringConstant) return null;
+    ir.StringConstant stringValue = nameValueFinal;
     String name = stringValue.value;
     String prefix = 'dart2js:';
     if (!name.startsWith(prefix)) return null;
@@ -377,7 +376,7 @@
     ir.Constant constant = constantExpression.constant;
     assert(constant is! ir.UnevaluatedConstant,
         "Unexpected unevaluated constant on $member: $metadata");
-    PragmaAnnotationData data = _getPragmaAnnotation(constant);
+    PragmaAnnotationData? data = _getPragmaAnnotation(constant);
     if (data != null) {
       annotations.add(data);
     }
diff --git a/pkg/compiler/lib/src/ir/modular.dart b/pkg/compiler/lib/src/ir/modular.dart
index 5487173..4713bbe 100644
--- a/pkg/compiler/lib/src/ir/modular.dart
+++ b/pkg/compiler/lib/src/ir/modular.dart
@@ -20,16 +20,10 @@
 import '../serialization/serialization.dart';
 import '../util/enumset.dart';
 import 'annotations.dart';
-import 'constants.dart';
 import 'impact.dart';
 import 'scope.dart';
 
-class ModularCore {
-  final ir.Component component;
-  final Dart2jsConstantEvaluator constantEvaluator;
-
-  ModularCore(this.component, this.constantEvaluator);
-}
+export 'modular_migrated.dart';
 
 class ModularMemberData {
   final ScopeModel scopeModel;
diff --git a/pkg/compiler/lib/src/ir/modular_migrated.dart b/pkg/compiler/lib/src/ir/modular_migrated.dart
new file mode 100644
index 0000000..281f40f
--- /dev/null
+++ b/pkg/compiler/lib/src/ir/modular_migrated.dart
@@ -0,0 +1,10 @@
+import 'package:compiler/src/ir/constants.dart';
+import 'package:kernel/ast.dart' as ir;
+
+// TODO(48820): Move this back to modular.dart
+class ModularCore {
+  final ir.Component component;
+  final Dart2jsConstantEvaluator constantEvaluator;
+
+  ModularCore(this.component, this.constantEvaluator);
+}
diff --git a/tools/VERSION b/tools/VERSION
index b892b81..2676ad4 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 18
 PATCH 0
-PRERELEASE 113
+PRERELEASE 114
 PRERELEASE_PATCH 0
\ No newline at end of file
