diff --git a/DEPS b/DEPS
index a7cc76e..da99e64 100644
--- a/DEPS
+++ b/DEPS
@@ -39,12 +39,12 @@
 
   # Checked-in SDK version. The checked-in SDK is a Dart SDK distribution in a
   # cipd package used to run Dart scripts in the build and test infrastructure.
-  "sdk_tag": "version:2.12.0",
+  "sdk_tag": "version:2.13.0-211.13.beta",
 
   # co19 is a cipd package. Use update.sh in tests/co19[_2] to update these
   # hashes. It requires access to the dart-build-access group, which EngProd
   # has.
-  "co19_rev": "8c5fea8a51cf8c35724ddf136248350bb307d344",
+  "co19_rev": "13f010c4047c4c7d52afe67ecc57ebc415ea4ea8",
   "co19_2_rev": "f7f583366396cb1457e58c9bfb6d6e53dc21d741",
 
   # The internal benchmarks to use. See go/dart-benchmarks-internal
diff --git a/build/config/mac/mac_sdk.gni b/build/config/mac/mac_sdk.gni
index e93ede0..ae8cd00 100644
--- a/build/config/mac/mac_sdk.gni
+++ b/build/config/mac/mac_sdk.gni
@@ -6,9 +6,9 @@
 
 declare_args() {
   # Minimum supported version of the Mac SDK.
-  mac_sdk_min = "10.8"
+  mac_sdk_min = "10.13"
 
-  # Path to a specific version of the Mac SDKJ, not including a backslash at
+  # Path to a specific version of the Mac SDK, not including a backslash at
   # the end. If empty, the path to the lowest version greater than or equal to
   # mac_sdk_min is used.
   mac_sdk_path = ""
diff --git a/pkg/compiler/lib/src/ir/scope_visitor.dart b/pkg/compiler/lib/src/ir/scope_visitor.dart
index abaff07..2a6ddc4 100644
--- a/pkg/compiler/lib/src/ir/scope_visitor.dart
+++ b/pkg/compiler/lib/src/ir/scope_visitor.dart
@@ -879,7 +879,7 @@
   }
 
   @override
-  EvaluationComplexity visitMapEntry(ir.MapEntry node) {
+  EvaluationComplexity visitMapLiteralEntry(ir.MapLiteralEntry node) {
     node.key = _handleExpression(node.key);
     EvaluationComplexity keyComplexity = _lastExpressionComplexity;
 
diff --git a/pkg/compiler/lib/src/ir/static_type.dart b/pkg/compiler/lib/src/ir/static_type.dart
index 224a793..0ea8c89 100644
--- a/pkg/compiler/lib/src/ir/static_type.dart
+++ b/pkg/compiler/lib/src/ir/static_type.dart
@@ -1572,7 +1572,7 @@
   }
 
   @override
-  Null visitMapEntry(ir.MapEntry entry) {
+  Null visitMapLiteralEntry(ir.MapLiteralEntry entry) {
     visitNode(entry.key);
     visitNode(entry.value);
   }
diff --git a/pkg/compiler/lib/src/kernel/dart2js_target.dart b/pkg/compiler/lib/src/kernel/dart2js_target.dart
index 96cd1ad..c10c0e9 100644
--- a/pkg/compiler/lib/src/kernel/dart2js_target.dart
+++ b/pkg/compiler/lib/src/kernel/dart2js_target.dart
@@ -185,9 +185,9 @@
           new ir.ListLiteral(
               arguments.types.map((t) => new ir.TypeLiteral(t)).toList()),
           new ir.ListLiteral(arguments.positional)..fileOffset = offset,
-          new ir.MapLiteral(new List<ir.MapEntry>.from(
+          new ir.MapLiteral(new List<ir.MapLiteralEntry>.from(
               arguments.named.map((ir.NamedExpression arg) {
-            return new ir.MapEntry(
+            return new ir.MapLiteralEntry(
                 new ir.StringLiteral(arg.name)..fileOffset = arg.fileOffset,
                 arg.value)
               ..fileOffset = arg.fileOffset;
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index c9a40cd..498c686 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -3214,7 +3214,7 @@
 
     // The map literal constructors take the key-value pairs as a List
     List<HInstruction> constructorArgs = <HInstruction>[];
-    for (ir.MapEntry mapEntry in node.entries) {
+    for (ir.MapLiteralEntry mapEntry in node.entries) {
       mapEntry.key.accept(this);
       constructorArgs.add(pop());
       mapEntry.value.accept(this);
@@ -3287,7 +3287,7 @@
   }
 
   @override
-  void visitMapEntry(ir.MapEntry node) {
+  void visitMapLiteralEntry(ir.MapLiteralEntry node) {
     failedAt(CURRENT_ELEMENT_SPANNABLE,
         'ir.MapEntry should be handled in visitMapLiteral');
   }
@@ -4269,7 +4269,7 @@
           selector = new Selector.indexSet();
         } else {
           if (namedArgumentsLiteral is ir.MapLiteral) {
-            namedArgumentsLiteral.entries.forEach((ir.MapEntry entry) {
+            namedArgumentsLiteral.entries.forEach((ir.MapLiteralEntry entry) {
               String key = _readStringLiteral(entry.key);
               namedArguments[key] = entry.value;
             });
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index cba549e..791ada2 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -10,7 +10,7 @@
 
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
-import 'package:kernel/kernel.dart' hide MapEntry;
+import 'package:kernel/kernel.dart';
 import 'package:kernel/library_index.dart';
 import 'package:kernel/src/dart_type_equivalence.dart';
 import 'package:kernel/type_algebra.dart';
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index c585aa4..473b404 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -217,7 +217,7 @@
       if (arguments.named.isNotEmpty)
         MapLiteral([
           for (var n in arguments.named)
-            MapEntry(SymbolLiteral(n.name), n.value)
+            MapLiteralEntry(SymbolLiteral(n.name), n.value)
         ], keyType: coreTypes.symbolLegacyRawType),
     ];
     return createInvocation('method', ctorArgs);
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index e7d9500..2164ae6 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -2919,7 +2919,7 @@
     } else {
       assert(conditionStatement is EmptyStatement);
     }
-    if (entry is MapEntry) {
+    if (entry is MapLiteralEntry) {
       ForMapEntry result = forest.createForMapEntry(
           offsetForToken(forToken), variables, condition, updates, entry);
       typeInferrer?.assignedVariables?.endNode(result);
@@ -3115,7 +3115,7 @@
     List<Expression> expressions = <Expression>[];
     if (setOrMapEntries != null) {
       for (dynamic entry in setOrMapEntries) {
-        if (entry is MapEntry) {
+        if (entry is MapLiteralEntry) {
           // TODO(danrubel): report the error on the colon
           addProblem(fasta.templateExpectedButGot.withArguments(','),
               entry.fileOffset, 1);
@@ -3163,7 +3163,7 @@
       // TODO(danrubel): Revise this to handle control flow and spread
       if (elem == invalidCollectionElement) {
         setOrMapEntries.removeAt(i);
-      } else if (elem is MapEntry) {
+      } else if (elem is MapLiteralEntry) {
         setOrMapEntries[i] = elem;
       } else {
         setOrMapEntries[i] = toValue(elem);
@@ -3186,7 +3186,7 @@
             : null;
 
     for (int i = 0; i < setOrMapEntries.length; ++i) {
-      if (setOrMapEntries[i] is! MapEntry &&
+      if (setOrMapEntries[i] is! MapLiteralEntry &&
           !isConvertibleToMapEntry(setOrMapEntries[i])) {
         hasSetEntry = true;
       }
@@ -3201,10 +3201,10 @@
     if (isSet) {
       buildLiteralSet(typeArguments, constKeyword, leftBrace, setOrMapEntries);
     } else {
-      List<MapEntry> mapEntries =
-          new List<MapEntry>.filled(setOrMapEntries.length, null);
+      List<MapLiteralEntry> mapEntries =
+          new List<MapLiteralEntry>.filled(setOrMapEntries.length, null);
       for (int i = 0; i < setOrMapEntries.length; ++i) {
-        if (setOrMapEntries[i] is MapEntry) {
+        if (setOrMapEntries[i] is MapLiteralEntry) {
           mapEntries[i] = setOrMapEntries[i];
         } else {
           mapEntries[i] = convertToMapEntry(setOrMapEntries[i], this,
@@ -3237,7 +3237,7 @@
   }
 
   void buildLiteralMap(List<UnresolvedType> typeArguments, Token constKeyword,
-      Token leftBrace, List<MapEntry> entries) {
+      Token leftBrace, List<MapLiteralEntry> entries) {
     DartType keyType;
     DartType valueType;
     if (typeArguments != null) {
@@ -4780,7 +4780,7 @@
     // Resolve the top of the stack so that if it's a delayed assignment it
     // happens before we go into the else block.
     Object node = pop();
-    if (node is! MapEntry) node = toValue(node);
+    if (node is! MapLiteralEntry) node = toValue(node);
     // This is matched by the call to [beginNode] in
     // [handleThenControlFlow] and by the call to [storeInfo] in
     // [endIfElseControlFlow].
@@ -4797,7 +4797,7 @@
 
     transformCollections = true;
     TreeNode node;
-    if (entry is MapEntry) {
+    if (entry is MapLiteralEntry) {
       node = forest.createIfMapEntry(
           offsetForToken(ifToken), toValue(condition), entry);
     } else {
@@ -4822,13 +4822,13 @@
 
     transformCollections = true;
     TreeNode node;
-    if (thenEntry is MapEntry) {
-      if (elseEntry is MapEntry) {
+    if (thenEntry is MapLiteralEntry) {
+      if (elseEntry is MapLiteralEntry) {
         node = forest.createIfMapEntry(
             offsetForToken(ifToken), toValue(condition), thenEntry, elseEntry);
       } else if (elseEntry is ControlFlowElement) {
-        MapEntry elseMapEntry =
-            elseEntry.toMapEntry(typeInferrer?.assignedVariables?.reassignInfo);
+        MapLiteralEntry elseMapEntry = elseEntry
+            .toMapLiteralEntry(typeInferrer?.assignedVariables?.reassignInfo);
         if (elseMapEntry != null) {
           node = forest.createIfMapEntry(offsetForToken(ifToken),
               toValue(condition), thenEntry, elseMapEntry);
@@ -4836,7 +4836,7 @@
           int offset = elseEntry is Expression
               ? elseEntry.fileOffset
               : offsetForToken(ifToken);
-          node = new MapEntry(
+          node = new MapLiteralEntry(
               buildProblem(
                   fasta.messageCantDisambiguateAmbiguousInformation, offset, 1),
               new NullLiteral())
@@ -4846,16 +4846,16 @@
         int offset = elseEntry is Expression
             ? elseEntry.fileOffset
             : offsetForToken(ifToken);
-        node = new MapEntry(
+        node = new MapLiteralEntry(
             buildProblem(fasta.templateExpectedAfterButGot.withArguments(':'),
                 offset, 1),
             new NullLiteral())
           ..fileOffset = offsetForToken(ifToken);
       }
-    } else if (elseEntry is MapEntry) {
+    } else if (elseEntry is MapLiteralEntry) {
       if (thenEntry is ControlFlowElement) {
-        MapEntry thenMapEntry =
-            thenEntry.toMapEntry(typeInferrer?.assignedVariables?.reassignInfo);
+        MapLiteralEntry thenMapEntry = thenEntry
+            .toMapLiteralEntry(typeInferrer?.assignedVariables?.reassignInfo);
         if (thenMapEntry != null) {
           node = forest.createIfMapEntry(offsetForToken(ifToken),
               toValue(condition), thenMapEntry, elseEntry);
@@ -4863,7 +4863,7 @@
           int offset = thenEntry is Expression
               ? thenEntry.fileOffset
               : offsetForToken(ifToken);
-          node = new MapEntry(
+          node = new MapLiteralEntry(
               buildProblem(
                   fasta.messageCantDisambiguateAmbiguousInformation, offset, 1),
               new NullLiteral())
@@ -4873,7 +4873,7 @@
         int offset = thenEntry is Expression
             ? thenEntry.fileOffset
             : offsetForToken(ifToken);
-        node = new MapEntry(
+        node = new MapLiteralEntry(
             buildProblem(fasta.templateExpectedAfterButGot.withArguments(':'),
                 offset, 1),
             new NullLiteral())
@@ -5257,7 +5257,7 @@
     typeInferrer?.assignedVariables?.pushNode(assignedVariablesNodeInfo);
     VariableDeclaration variable = elements.variable;
     Expression problem = elements.expressionProblem;
-    if (entry is MapEntry) {
+    if (entry is MapLiteralEntry) {
       ForInMapEntry result = forest.createForInMapEntry(
           offsetForToken(forToken),
           variable,
diff --git a/pkg/front_end/lib/src/fasta/kernel/collections.dart b/pkg/front_end/lib/src/fasta/kernel/collections.dart
index b29d126..c4b3d01 100644
--- a/pkg/front_end/lib/src/fasta/kernel/collections.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/collections.dart
@@ -45,14 +45,15 @@
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
       v.defaultExpression(this, arg);
 
-  /// Returns this control flow element as a [MapEntry], or `null` if this
-  /// control flow element cannot be converted into a [MapEntry].
+  /// Returns this control flow element as a [MapLiteralEntry], or `null` if
+  /// this control flow element cannot be converted into a [MapLiteralEntry].
   ///
   /// [onConvertElement] is called when a [ForElement], [ForInElement], or
   /// [IfElement] is converted to a [ForMapEntry], [ForInMapEntry], or
   /// [IfMapEntry], respectively.
   // TODO(johnniwinther): Merge this with [convertToMapEntry].
-  MapEntry toMapEntry(void onConvertElement(TreeNode from, TreeNode to));
+  MapLiteralEntry toMapLiteralEntry(
+      void onConvertElement(TreeNode from, TreeNode to));
 }
 
 /// A spread element in a list or set literal.
@@ -92,7 +93,8 @@
   }
 
   @override
-  SpreadMapEntry toMapEntry(void onConvertElement(TreeNode from, TreeNode to)) {
+  SpreadMapEntry toMapLiteralEntry(
+      void onConvertElement(TreeNode from, TreeNode to)) {
     return new SpreadMapEntry(expression, isNullAware)..fileOffset = fileOffset;
   }
 
@@ -163,18 +165,19 @@
   }
 
   @override
-  MapEntry toMapEntry(void onConvertElement(TreeNode from, TreeNode to)) {
-    MapEntry thenEntry;
+  MapLiteralEntry toMapLiteralEntry(
+      void onConvertElement(TreeNode from, TreeNode to)) {
+    MapLiteralEntry thenEntry;
     if (then is ControlFlowElement) {
       ControlFlowElement thenElement = then;
-      thenEntry = thenElement.toMapEntry(onConvertElement);
+      thenEntry = thenElement.toMapLiteralEntry(onConvertElement);
     }
     if (thenEntry == null) return null;
-    MapEntry otherwiseEntry;
+    MapLiteralEntry otherwiseEntry;
     if (otherwise != null) {
       if (otherwise is ControlFlowElement) {
         ControlFlowElement otherwiseElement = otherwise;
-        otherwiseEntry = otherwiseElement.toMapEntry(onConvertElement);
+        otherwiseEntry = otherwiseElement.toMapLiteralEntry(onConvertElement);
       }
       if (otherwiseEntry == null) return null;
     }
@@ -253,11 +256,12 @@
   }
 
   @override
-  MapEntry toMapEntry(void onConvertElement(TreeNode from, TreeNode to)) {
-    MapEntry bodyEntry;
+  MapLiteralEntry toMapLiteralEntry(
+      void onConvertElement(TreeNode from, TreeNode to)) {
+    MapLiteralEntry bodyEntry;
     if (body is ControlFlowElement) {
       ControlFlowElement bodyElement = body;
-      bodyEntry = bodyElement.toMapEntry(onConvertElement);
+      bodyEntry = bodyElement.toMapLiteralEntry(onConvertElement);
     }
     if (bodyEntry == null) return null;
     ForMapEntry result =
@@ -369,11 +373,12 @@
   }
 
   @override
-  MapEntry toMapEntry(void onConvertElement(TreeNode from, TreeNode to)) {
-    MapEntry bodyEntry;
+  MapLiteralEntry toMapLiteralEntry(
+      void onConvertElement(TreeNode from, TreeNode to)) {
+    MapLiteralEntry bodyEntry;
     if (body is ControlFlowElement) {
       ControlFlowElement bodyElement = body;
-      bodyEntry = bodyElement.toMapEntry(onConvertElement);
+      bodyEntry = bodyElement.toMapLiteralEntry(onConvertElement);
     }
     if (bodyEntry == null) return null;
     ForInMapEntry result = new ForInMapEntry(variable, iterable,
@@ -395,7 +400,7 @@
   }
 }
 
-mixin ControlFlowMapEntry implements MapEntry {
+mixin ControlFlowMapEntry implements MapLiteralEntry {
   @override
   Expression get key {
     throw new UnsupportedError('ControlFlowMapEntry.key getter');
@@ -483,8 +488,8 @@
 /// An 'if' element in a map literal.
 class IfMapEntry extends TreeNode with ControlFlowMapEntry {
   Expression condition;
-  MapEntry then;
-  MapEntry otherwise;
+  MapLiteralEntry then;
+  MapLiteralEntry otherwise;
 
   IfMapEntry(this.condition, this.then, this.otherwise) {
     condition?.parent = this;
@@ -522,11 +527,11 @@
       condition?.parent = this;
     }
     if (then != null) {
-      then = v.transformOrRemove(then, dummyMapEntry);
+      then = v.transformOrRemove(then, dummyMapLiteralEntry);
       then?.parent = this;
     }
     if (otherwise != null) {
-      otherwise = v.transformOrRemove(otherwise, dummyMapEntry);
+      otherwise = v.transformOrRemove(otherwise, dummyMapLiteralEntry);
       otherwise?.parent = this;
     }
   }
@@ -547,7 +552,7 @@
   final List<VariableDeclaration> variables; // May be empty, but not null.
   Expression condition; // May be null.
   final List<Expression> updates; // May be empty, but not null.
-  MapEntry body;
+  MapLiteralEntry body;
 
   ForMapEntry(this.variables, this.condition, this.updates, this.body) {
     setParents(variables, this);
@@ -587,7 +592,7 @@
     }
     v.transformExpressionList(updates, this);
     if (body != null) {
-      body = v.transformOrRemove(body, dummyMapEntry);
+      body = v.transformOrRemove(body, dummyMapLiteralEntry);
       body?.parent = this;
     }
   }
@@ -609,7 +614,7 @@
   Expression iterable;
   Expression syntheticAssignment; // May be null.
   Statement expressionEffects; // May be null.
-  MapEntry body;
+  MapLiteralEntry body;
   Expression problem; // May be null.
   bool isAsync; // True if this is an 'await for' loop.
 
@@ -685,7 +690,7 @@
       expressionEffects?.parent = this;
     }
     if (body != null) {
-      body = v.transformOrRemove(body, dummyMapEntry);
+      body = v.transformOrRemove(body, dummyMapLiteralEntry);
       body?.parent = this;
     }
     if (problem != null) {
@@ -712,7 +717,7 @@
 /// [onConvertMapEntry] is called when a [ForMapEntry], [ForInMapEntry], or
 /// [IfMapEntry] is converted to a [ForElement], [ForInElement], or [IfElement],
 /// respectively.
-Expression convertToElement(MapEntry entry, InferenceHelper helper,
+Expression convertToElement(MapLiteralEntry entry, InferenceHelper helper,
     void onConvertMapEntry(TreeNode from, TreeNode to)) {
   if (entry is SpreadMapEntry) {
     return new SpreadElement(entry.expression, entry.isNullAware)
@@ -780,14 +785,14 @@
   return false;
 }
 
-/// Convert [element] to a [MapEntry], if possible. If [element] cannot be
-/// converted an error reported through [helper] and a map entry holding an
+/// Convert [element] to a [MapLiteralEntry], if possible. If [element] cannot
+/// be converted an error reported through [helper] and a map entry holding an
 /// invalid expression is returned.
 ///
 /// [onConvertElement] is called when a [ForElement], [ForInElement], or
 /// [IfElement] is converted to a [ForMapEntry], [ForInMapEntry], or
 /// [IfMapEntry], respectively.
-MapEntry convertToMapEntry(Expression element, InferenceHelper helper,
+MapLiteralEntry convertToMapEntry(Expression element, InferenceHelper helper,
     void onConvertElement(TreeNode from, TreeNode to)) {
   if (element is SpreadElement) {
     return new SpreadMapEntry(element.expression, element.isNullAware)
@@ -827,7 +832,7 @@
     onConvertElement(element, result);
     return result;
   }
-  return new MapEntry(
+  return new MapLiteralEntry(
       helper.buildProblem(
         templateExpectedAfterButGot.withArguments(':'),
         element.fileOffset,
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_collection_builders.dart b/pkg/front_end/lib/src/fasta/kernel/constant_collection_builders.dart
index 6d95ecf..a11857d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_collection_builders.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_collection_builders.dart
@@ -228,7 +228,7 @@
   ///
   /// Returns [null] on success and an error-"constant" on failure, as such the
   /// return value should be checked.
-  AbortConstant add(MapEntry element) {
+  AbortConstant add(MapLiteralEntry element) {
     Constant key = evaluator._evaluateSubexpression(element.key);
     if (key is AbortConstant) return key;
     Constant value = evaluator._evaluateSubexpression(element.value);
@@ -236,9 +236,10 @@
     if (evaluator.shouldBeUnevaluated) {
       parts.add(evaluator.unevaluated(
           element.key,
-          new MapLiteral(
-              [new MapEntry(evaluator.extract(key), evaluator.extract(value))],
-              isConst: true)));
+          new MapLiteral([
+            new MapLiteralEntry(
+                evaluator.extract(key), evaluator.extract(value))
+          ], isConst: true)));
       return null;
     } else {
       return addConstant(key, value, element.key, element.value);
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index 35a2f67..ea72f96 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -1413,7 +1413,7 @@
     // We therefore reset it before each call, combine it and set it correctly
     // at the end.
     bool wasOrBecameUnevaluated = seenUnevaluatedChild;
-    for (MapEntry element in node.entries) {
+    for (MapLiteralEntry element in node.entries) {
       seenUnevaluatedChild = false;
       AbortConstant error = builder.add(element);
       wasOrBecameUnevaluated |= seenUnevaluatedChild;
diff --git a/pkg/front_end/lib/src/fasta/kernel/forest.dart b/pkg/front_end/lib/src/fasta/kernel/forest.dart
index 9be6294..9839741 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forest.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forest.dart
@@ -154,7 +154,7 @@
   /// if the second type argument cannot be resolved. The list of [entries] is a
   /// list of the representations of the map entries.
   MapLiteral createMapLiteral(int fileOffset, DartType keyType,
-      DartType valueType, List<MapEntry> entries,
+      DartType valueType, List<MapLiteralEntry> entries,
       {bool isConst}) {
     assert(fileOffset != null);
     assert(isConst != null);
@@ -193,9 +193,10 @@
   /// [fileOffset]. The [key] is the representation of the expression used to
   /// compute the key. The [value] is the representation of the expression used
   /// to compute the value.
-  MapEntry createMapEntry(int fileOffset, Expression key, Expression value) {
+  MapLiteralEntry createMapEntry(
+      int fileOffset, Expression key, Expression value) {
     assert(fileOffset != null);
-    return new MapEntry(key, value)..fileOffset = fileOffset;
+    return new MapLiteralEntry(key, value)..fileOffset = fileOffset;
   }
 
   Expression createLoadLibrary(
@@ -234,8 +235,9 @@
     return new IfElement(condition, then, otherwise)..fileOffset = fileOffset;
   }
 
-  MapEntry createIfMapEntry(int fileOffset, Expression condition, MapEntry then,
-      [MapEntry otherwise]) {
+  MapLiteralEntry createIfMapEntry(
+      int fileOffset, Expression condition, MapLiteralEntry then,
+      [MapLiteralEntry otherwise]) {
     assert(fileOffset != null);
     return new IfMapEntry(condition, then, otherwise)..fileOffset = fileOffset;
   }
@@ -251,12 +253,12 @@
       ..fileOffset = fileOffset;
   }
 
-  MapEntry createForMapEntry(
+  MapLiteralEntry createForMapEntry(
       int fileOffset,
       List<VariableDeclaration> variables,
       Expression condition,
       List<Expression> updates,
-      MapEntry body) {
+      MapLiteralEntry body) {
     assert(fileOffset != null);
     return new ForMapEntry(variables, condition, updates, body)
       ..fileOffset = fileOffset;
@@ -278,13 +280,13 @@
       ..fileOffset = fileOffset;
   }
 
-  MapEntry createForInMapEntry(
+  MapLiteralEntry createForInMapEntry(
       int fileOffset,
       VariableDeclaration variable,
       Expression iterable,
       Expression synthesizedAssignment,
       Statement expressionEffects,
-      MapEntry body,
+      MapLiteralEntry body,
       Expression problem,
       {bool isAsync: false}) {
     assert(fileOffset != null);
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index 38e815c..8324530 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -1934,8 +1934,8 @@
   // actualTypesForSet, only inferMapEntry adds exactly one element to that
   // list: the actual type of the iterable spread elements in case the map
   // literal will be disambiguated as a set literal later.
-  MapEntry inferMapEntry(
-      MapEntry entry,
+  MapLiteralEntry inferMapEntry(
+      MapLiteralEntry entry,
       TreeNode parent,
       DartType inferredKeyType,
       DartType inferredValueType,
@@ -1968,12 +1968,12 @@
       DartType actualElementType =
           getSpreadElementType(spreadType, spreadTypeBound, entry.isNullAware);
 
-      MapEntry replacement = entry;
+      MapLiteralEntry replacement = entry;
       if (typeChecksNeeded) {
         if (actualKeyType == null) {
           if (inferrer.coreTypes.isNull(spreadTypeBound) &&
               !entry.isNullAware) {
-            replacement = new MapEntry(
+            replacement = new MapLiteralEntry(
                 inferrer.helper.buildProblem(
                     templateNonNullAwareSpreadIsNull.withArguments(
                         spreadType, inferrer.isNonNullableByDefault),
@@ -2014,7 +2014,7 @@
                     entry,
                     (type) => !type.isPotentiallyNullable));
             _copyNonPromotionReasonToReplacement(entry, problem);
-            replacement = new MapEntry(problem, new NullLiteral())
+            replacement = new MapLiteralEntry(problem, new NullLiteral())
               ..fileOffset = entry.fileOffset;
           }
         } else if (spreadTypeBound is InterfaceType) {
@@ -2128,7 +2128,7 @@
           if (keyError != null || valueError != null) {
             keyError ??= new NullLiteral();
             valueError ??= new NullLiteral();
-            replacement = new MapEntry(keyError, valueError)
+            replacement = new MapLiteralEntry(keyError, valueError)
               ..fileOffset = entry.fileOffset;
           }
         }
@@ -2181,7 +2181,7 @@
       // Note that this recursive invocation of inferMapEntry will add two types
       // to actualTypes; they are the actual types of the current invocation if
       // the 'else' branch is empty.
-      MapEntry then = inferMapEntry(
+      MapLiteralEntry then = inferMapEntry(
           entry.then,
           entry,
           inferredKeyType,
@@ -2194,7 +2194,7 @@
           inferenceNeeded,
           typeChecksNeeded);
       entry.then = then..parent = entry;
-      MapEntry otherwise;
+      MapLiteralEntry otherwise;
       if (entry.otherwise != null) {
         inferrer.flowAnalysis.ifStatement_elseBegin();
         // We need to modify the actual types added in the recursive call to
@@ -2282,7 +2282,7 @@
       }
       inferrer.flowAnalysis.for_bodyBegin(null, entry.condition);
       // Actual types are added by the recursive call.
-      MapEntry body = inferMapEntry(
+      MapLiteralEntry body = inferMapEntry(
           entry.body,
           entry,
           inferredKeyType,
@@ -2334,7 +2334,7 @@
         entry.problem = problemResult.expression..parent = entry;
       }
       // Actual types are added by the recursive call.
-      MapEntry body = inferMapEntry(
+      MapLiteralEntry body = inferMapEntry(
           entry.body,
           entry,
           inferredKeyType,
@@ -2375,16 +2375,16 @@
     }
   }
 
-  MapEntry checkMapEntry(
-      MapEntry entry,
+  MapLiteralEntry checkMapEntry(
+      MapLiteralEntry entry,
       DartType keyType,
       DartType valueType,
       Map<TreeNode, DartType> inferredSpreadTypes,
       Map<Expression, DartType> inferredConditionTypes) {
     // It's disambiguated as a map literal.
-    MapEntry replacement = entry;
+    MapLiteralEntry replacement = entry;
     if (iterableSpreadOffset != null) {
-      replacement = new MapEntry(
+      replacement = new MapLiteralEntry(
           inferrer.helper.buildProblem(
               templateSpreadMapEntryTypeMismatch.withArguments(
                   iterableSpreadType, inferrer.isNonNullableByDefault),
@@ -2404,12 +2404,12 @@
         entry.expression = expression..parent = entry;
       }
     } else if (entry is IfMapEntry) {
-      MapEntry then = checkMapEntry(entry.then, keyType, valueType,
+      MapLiteralEntry then = checkMapEntry(entry.then, keyType, valueType,
           inferredSpreadTypes, inferredConditionTypes);
       entry.then = then..parent = entry;
       if (entry.otherwise != null) {
-        MapEntry otherwise = checkMapEntry(entry.otherwise, keyType, valueType,
-            inferredSpreadTypes, inferredConditionTypes);
+        MapLiteralEntry otherwise = checkMapEntry(entry.otherwise, keyType,
+            valueType, inferredSpreadTypes, inferredConditionTypes);
         entry.otherwise = otherwise..parent = entry;
       }
     } else if (entry is ForMapEntry) {
@@ -2421,11 +2421,11 @@
             entry.condition);
         entry.condition = condition..parent = entry;
       }
-      MapEntry body = checkMapEntry(entry.body, keyType, valueType,
+      MapLiteralEntry body = checkMapEntry(entry.body, keyType, valueType,
           inferredSpreadTypes, inferredConditionTypes);
       entry.body = body..parent = entry;
     } else if (entry is ForInMapEntry) {
-      MapEntry body = checkMapEntry(entry.body, keyType, valueType,
+      MapLiteralEntry body = checkMapEntry(entry.body, keyType, valueType,
           inferredSpreadTypes, inferredConditionTypes);
       entry.body = body..parent = entry;
     } else {
@@ -2526,7 +2526,7 @@
             <DartType>[inferredKeyType, inferredValueType]);
       }
       for (int index = 0; index < node.entries.length; ++index) {
-        MapEntry entry = node.entries[index];
+        MapLiteralEntry entry = node.entries[index];
         entry = inferMapEntry(
             entry,
             node,
@@ -2648,7 +2648,7 @@
     }
     if (typeChecksNeeded) {
       for (int index = 0; index < node.entries.length; ++index) {
-        MapEntry entry = checkMapEntry(node.entries[index], node.keyType,
+        MapLiteralEntry entry = checkMapEntry(node.entries[index], node.keyType,
             node.valueType, inferredSpreadTypes, inferredConditionTypes);
         node.entries[index] = entry..parent = node;
       }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart
index 3282aea..06d76b7 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart
@@ -47,7 +47,7 @@
         ListLiteral,
         LocalInitializer,
         Location,
-        MapEntry,
+        MapLiteralEntry,
         MapLiteral,
         Member,
         MethodInvocation,
diff --git a/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart b/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart
index d017229..60ea42b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/transform_collections.dart
@@ -459,7 +459,7 @@
   }
 
   void _translateEntry(
-      MapEntry entry,
+      MapLiteralEntry entry,
       InterfaceType receiverType,
       DartType keyType,
       DartType valueType,
@@ -480,7 +480,7 @@
     }
   }
 
-  void _addNormalEntry(MapEntry entry, InterfaceType receiverType,
+  void _addNormalEntry(MapLiteralEntry entry, InterfaceType receiverType,
       VariableDeclaration result, List<Statement> body) {
     body.add(_createExpressionStatement(_createIndexSet(entry.fileOffset,
         _createVariableGet(result), receiverType, entry.key, entry.value)));
@@ -741,7 +741,7 @@
     // If there were no control-flow entries we are done.
     if (i == node.entries.length) return node;
 
-    MapLiteral makeLiteral(int fileOffset, List<MapEntry> entries) {
+    MapLiteral makeLiteral(int fileOffset, List<MapLiteralEntry> entries) {
       return _createMapLiteral(
           fileOffset, node.keyType, node.valueType, entries,
           isConst: true);
@@ -749,13 +749,14 @@
 
     // Build a concatenation node.
     List<Expression> parts = [];
-    List<MapEntry> currentPart = i > 0 ? node.entries.sublist(0, i) : null;
+    List<MapLiteralEntry> currentPart =
+        i > 0 ? node.entries.sublist(0, i) : null;
 
     DartType collectionType = _typeEnvironment.mapType(
         node.keyType, node.valueType, _currentLibrary.nonNullable);
 
     for (; i < node.entries.length; ++i) {
-      MapEntry entry = node.entries[i];
+      MapLiteralEntry entry = node.entries[i];
       if (entry is SpreadMapEntry) {
         if (currentPart != null) {
           parts.add(makeLiteral(node.fileOffset, currentPart));
@@ -789,7 +790,7 @@
         unhandled("${entry.runtimeType}", "_translateConstMap",
             entry.fileOffset, getFileUri(entry));
       } else {
-        currentPart ??= <MapEntry>[];
+        currentPart ??= <MapLiteralEntry>[];
         currentPart.add(entry.accept<TreeNode>(this));
       }
     }
@@ -846,7 +847,7 @@
   }
 
   MapLiteral _createMapLiteral(int fileOffset, DartType keyType,
-      DartType valueType, List<MapEntry> entries,
+      DartType valueType, List<MapLiteralEntry> entries,
       {bool isConst: false}) {
     assert(fileOffset != null);
     assert(fileOffset != TreeNode.noOffset);
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 3276b83..0a1c8bb 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -16,7 +16,7 @@
 import 'package:front_end/src/fasta/dill/dill_library_builder.dart'
     show DillLibraryBuilder;
 
-import 'package:kernel/ast.dart' hide Combinator, MapEntry;
+import 'package:kernel/ast.dart' hide Combinator, MapLiteralEntry;
 
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 8111748..ad072b3 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -4,14 +4,12 @@
 
 // @dart = 2.9
 
-import 'dart:core' hide MapEntry;
-import 'dart:core' as core;
+import 'dart:core';
 
 import 'package:_fe_analyzer_shared/src/flow_analysis/flow_analysis.dart';
 
 import 'package:_fe_analyzer_shared/src/testing/id.dart';
 import 'package:_fe_analyzer_shared/src/util/link.dart';
-import 'package:front_end/src/fasta/kernel/class_hierarchy_builder.dart';
 
 import 'package:kernel/ast.dart';
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
@@ -286,7 +284,7 @@
     if (whyNotPromoted != null && whyNotPromoted.isNotEmpty) {
       _WhyNotPromotedVisitor whyNotPromotedVisitor =
           new _WhyNotPromotedVisitor(this);
-      for (core.MapEntry<DartType, NonPromotionReason> entry
+      for (MapEntry<DartType, NonPromotionReason> entry
           in whyNotPromoted.entries) {
         if (!typeFilter(entry.key)) continue;
         LocatedMessage message = entry.value.accept(whyNotPromotedVisitor);
diff --git a/pkg/front_end/test/id_tests/why_not_promoted_test.dart b/pkg/front_end/test/id_tests/why_not_promoted_test.dart
index 0b0b6ee..d339adc 100644
--- a/pkg/front_end/test/id_tests/why_not_promoted_test.dart
+++ b/pkg/front_end/test/id_tests/why_not_promoted_test.dart
@@ -14,7 +14,7 @@
 import 'package:front_end/src/fasta/type_inference/type_inference_engine.dart';
 import 'package:front_end/src/testing/id_testing_helper.dart';
 import 'package:front_end/src/testing/id_testing_utils.dart';
-import 'package:kernel/ast.dart' hide Variance, MapEntry;
+import 'package:kernel/ast.dart' hide Variance, MapLiteralEntry;
 
 main(List<String> args) async {
   Directory dataDir = new Directory.fromUri(
diff --git a/pkg/front_end/test/lint_test.status b/pkg/front_end/test/lint_test.status
index 4b2a34a..14ac1b5 100644
--- a/pkg/front_end/test/lint_test.status
+++ b/pkg/front_end/test/lint_test.status
@@ -36,10 +36,7 @@
 front_end/lib/src/fasta/source/scope_listener/Exports: Fail
 front_end/lib/src/fasta/source/source_class_builder/ImportsTwice: Fail
 front_end/lib/src/fasta/source/value_kinds/ImportsTwice: Fail
-front_end/lib/src/fasta/type_inference/type_inferrer/ImportsTwice: Fail
 front_end/lib/src/testing/id_testing_helper/Exports: Fail
-kernel/lib/ast/ImportsTwice: Fail
 kernel/lib/ast/Exports: Fail
 kernel/lib/kernel/Exports: Fail
 kernel/lib/testing/type_parser_environment/ImportsTwice: Fail
-kernel/lib/text/ast_to_text/ImportsTwice: Fail
diff --git a/pkg/front_end/testcases/general/issue45700.dart b/pkg/front_end/testcases/general/issue45700.crash_dart
similarity index 100%
rename from pkg/front_end/testcases/general/issue45700.dart
rename to pkg/front_end/testcases/general/issue45700.crash_dart
diff --git a/pkg/front_end/testcases/general/issue45700.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue45700.crash_dart.textual_outline.expect
similarity index 100%
rename from pkg/front_end/testcases/general/issue45700.dart.textual_outline.expect
rename to pkg/front_end/testcases/general/issue45700.crash_dart.textual_outline.expect
diff --git a/pkg/front_end/testcases/general/issue45700.dart.weak.expect b/pkg/front_end/testcases/general/issue45700.crash_dart.weak.expect
similarity index 70%
rename from pkg/front_end/testcases/general/issue45700.dart.weak.expect
rename to pkg/front_end/testcases/general/issue45700.crash_dart.weak.expect
index e33f323..a03c56f 100644
--- a/pkg/front_end/testcases/general/issue45700.dart.weak.expect
+++ b/pkg/front_end/testcases/general/issue45700.crash_dart.weak.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/issue45700.dart:5:7: Error: Can't use a function type as supertype.
+// pkg/front_end/testcases/general/issue45700.crash_dart:5:7: Error: Can't use a function type as supertype.
 // mixin M on Function() {}
 //       ^
 //
diff --git a/pkg/front_end/testcases/general/issue45700.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue45700.crash_dart.weak.outline.expect
similarity index 70%
rename from pkg/front_end/testcases/general/issue45700.dart.weak.outline.expect
rename to pkg/front_end/testcases/general/issue45700.crash_dart.weak.outline.expect
index bca7ff6..2c993ea 100644
--- a/pkg/front_end/testcases/general/issue45700.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/issue45700.crash_dart.weak.outline.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/issue45700.dart:5:7: Error: Can't use a function type as supertype.
+// pkg/front_end/testcases/general/issue45700.crash_dart:5:7: Error: Can't use a function type as supertype.
 // mixin M on Function() {}
 //       ^
 //
diff --git a/pkg/front_end/testcases/general/issue45700.dart.weak.expect b/pkg/front_end/testcases/general/issue45700.crash_dart.weak.transformed.expect
similarity index 70%
copy from pkg/front_end/testcases/general/issue45700.dart.weak.expect
copy to pkg/front_end/testcases/general/issue45700.crash_dart.weak.transformed.expect
index e33f323..a03c56f 100644
--- a/pkg/front_end/testcases/general/issue45700.dart.weak.expect
+++ b/pkg/front_end/testcases/general/issue45700.crash_dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/issue45700.dart:5:7: Error: Can't use a function type as supertype.
+// pkg/front_end/testcases/general/issue45700.crash_dart:5:7: Error: Can't use a function type as supertype.
 // mixin M on Function() {}
 //       ^
 //
diff --git a/pkg/front_end/testcases/general/issue45700.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue45700.dart.weak.transformed.expect
deleted file mode 100644
index e33f323..0000000
--- a/pkg/front_end/testcases/general/issue45700.dart.weak.transformed.expect
+++ /dev/null
@@ -1,14 +0,0 @@
-library /*isNonNullableByDefault*/;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/general/issue45700.dart:5:7: Error: Can't use a function type as supertype.
-// mixin M on Function() {}
-//       ^
-//
-import self as self;
-import "dart:core" as core;
-
-abstract class M extends core::Object /*isMixinDeclaration*/  {
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index ef59299..da0c0e1 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -65,7 +65,7 @@
 general/issue42997: FormatterCrash
 general/issue43363: FormatterCrash
 general/issue45490: FormatterCrash
-general/issue45700: FormatterCrash
+general/issue45700.crash: FormatterCrash
 general/many_errors: FormatterCrash
 general/null_safety_invalid_experiment: FormatterCrash
 general/null_safety_invalid_experiment_and_language_version: FormatterCrash
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 029f7b9..9f0dc34 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -65,7 +65,6 @@
 library kernel.ast;
 
 import 'dart:core';
-import 'dart:core' as core show MapEntry;
 import 'dart:collection' show ListBase;
 import 'dart:convert' show utf8;
 
@@ -7892,7 +7891,7 @@
   bool isConst;
   DartType keyType; // Not null, defaults to DynamicType.
   DartType valueType; // Not null, defaults to DynamicType.
-  final List<MapEntry> entries;
+  final List<MapLiteralEntry> entries;
 
   MapLiteral(this.entries,
       {this.keyType: const DynamicType(),
@@ -7968,20 +7967,21 @@
   }
 }
 
-class MapEntry extends TreeNode {
+class MapLiteralEntry extends TreeNode {
   Expression key;
   Expression value;
 
-  MapEntry(this.key, this.value) {
+  MapLiteralEntry(this.key, this.value) {
     key.parent = this;
     value.parent = this;
   }
 
   @override
-  R accept<R>(TreeVisitor<R> v) => v.visitMapEntry(this);
+  R accept<R>(TreeVisitor<R> v) => v.visitMapLiteralEntry(this);
 
   @override
-  R accept1<R, A>(TreeVisitor1<R, A> v, A arg) => v.visitMapEntry(this, arg);
+  R accept1<R, A>(TreeVisitor1<R, A> v, A arg) =>
+      v.visitMapLiteralEntry(this, arg);
 
   @override
   void visitChildren(Visitor v) {
@@ -12954,7 +12954,7 @@
   /// can't have metadata attached to them. Also, metadata is not saved on
   /// Block nodes inside BlockExpressions.
   static bool isSupported(Node node) {
-    return !(node is MapEntry ||
+    return !(node is MapLiteralEntry ||
         node is Catch ||
         (node is Block && node.parent is BlockExpression));
   }
@@ -13324,7 +13324,7 @@
         // `-1` is used as a dummy default value.
         -1);
     int i = 0;
-    for (core.MapEntry entry in map.entries) {
+    for (MapEntry entry in map.entries) {
       entryHashes[i++] = combine(entry.key.hashCode, entry.value.hashCode);
     }
     entryHashes.sort();
@@ -13733,12 +13733,13 @@
 /// constructor.
 final TypeParameter dummyTypeParameter = new TypeParameter();
 
-/// Non-nullable [MapEntry] dummy value.
+/// Non-nullable [MapLiteralEntry] dummy value.
 ///
 /// This is used as the removal sentinel in [RemovingTransformer] and can be
 /// used for instance as a dummy initial value for the `List.filled`
 /// constructor.
-final MapEntry dummyMapEntry = new MapEntry(dummyExpression, dummyExpression);
+final MapLiteralEntry dummyMapLiteralEntry =
+    new MapLiteralEntry(dummyExpression, dummyExpression);
 
 /// Non-nullable [Arguments] dummy value.
 ///
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index adc7012..2f49538 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -2496,14 +2496,14 @@
     return new ConstantExpression(constant, type)..fileOffset = offset;
   }
 
-  List<MapEntry> readMapEntryList() {
+  List<MapLiteralEntry> readMapEntryList() {
     int length = readUInt30();
-    return new List<MapEntry>.generate(length, (_) => readMapEntry(),
+    return new List<MapLiteralEntry>.generate(length, (_) => readMapEntry(),
         growable: useGrowableLists);
   }
 
-  MapEntry readMapEntry() {
-    return new MapEntry(readExpression(), readExpression());
+  MapLiteralEntry readMapEntry() {
+    return new MapLiteralEntry(readExpression(), readExpression());
   }
 
   List<Statement> readStatementList() {
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index c2c35282..7252dcc 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -1932,7 +1932,7 @@
   }
 
   @override
-  void visitMapEntry(MapEntry node) {
+  void visitMapLiteralEntry(MapLiteralEntry node) {
     // Note: there is no tag on MapEntry
     writeNode(node.key);
     writeNode(node.value);
diff --git a/pkg/kernel/lib/class_hierarchy.dart b/pkg/kernel/lib/class_hierarchy.dart
index 09d259d..e1a99a8 100644
--- a/pkg/kernel/lib/class_hierarchy.dart
+++ b/pkg/kernel/lib/class_hierarchy.dart
@@ -8,7 +8,7 @@
 import 'dart:math';
 import 'dart:typed_data';
 
-import 'ast.dart' hide MapEntry;
+import 'ast.dart';
 import 'core_types.dart';
 import 'type_algebra.dart';
 import 'src/heap.dart';
diff --git a/pkg/kernel/lib/clone.dart b/pkg/kernel/lib/clone.dart
index 62b04d9..da80fd1 100644
--- a/pkg/kernel/lib/clone.dart
+++ b/pkg/kernel/lib/clone.dart
@@ -317,8 +317,8 @@
         isConst: node.isConst);
   }
 
-  visitMapEntry(MapEntry node) {
-    return new MapEntry(clone(node.key), clone(node.value));
+  visitMapLiteralEntry(MapLiteralEntry node) {
+    return new MapLiteralEntry(clone(node.key), clone(node.value));
   }
 
   visitAwaitExpression(AwaitExpression node) {
diff --git a/pkg/kernel/lib/src/bounds_checks.dart b/pkg/kernel/lib/src/bounds_checks.dart
index d1cdd54..b3e9a44 100644
--- a/pkg/kernel/lib/src/bounds_checks.dart
+++ b/pkg/kernel/lib/src/bounds_checks.dart
@@ -4,7 +4,7 @@
 
 import 'package:kernel/src/replacement_visitor.dart';
 
-import '../ast.dart' hide MapEntry;
+import '../ast.dart';
 
 import '../type_algebra.dart' show Substitution, substitute;
 
diff --git a/pkg/kernel/lib/src/printer.dart b/pkg/kernel/lib/src/printer.dart
index b184440..3d28d32 100644
--- a/pkg/kernel/lib/src/printer.dart
+++ b/pkg/kernel/lib/src/printer.dart
@@ -223,7 +223,7 @@
     node.toTextInternal(this);
   }
 
-  void writeMapEntry(MapEntry node) {
+  void writeMapEntry(MapLiteralEntry node) {
     node.toTextInternal(this);
   }
 
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index 5066b0a..dc1c1d6 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -4,9 +4,7 @@
 
 library kernel.ast_to_text;
 
-import 'dart:core' hide MapEntry;
-import 'dart:core' as core show MapEntry;
-
+import 'dart:core';
 import 'dart:convert' show json;
 
 import '../ast.dart';
@@ -1787,7 +1785,7 @@
     writeSymbol('}');
   }
 
-  visitMapEntry(MapEntry node) {
+  visitMapLiteralEntry(MapLiteralEntry node) {
     writeExpression(node.key);
     writeComma(':');
     writeExpression(node.value);
@@ -2636,8 +2634,7 @@
     }
 
     writeSymbol(' {');
-    writeList(node.fieldValues.entries,
-        (core.MapEntry<Reference, Constant> entry) {
+    writeList(node.fieldValues.entries, (MapEntry<Reference, Constant> entry) {
       if (entry.key.node != null) {
         writeWord('${entry.key.asField.name.text}');
       } else {
diff --git a/pkg/kernel/lib/text/text_serializer.dart b/pkg/kernel/lib/text/text_serializer.dart
index ac705f2..a9ddadc 100644
--- a/pkg/kernel/lib/text/text_serializer.dart
+++ b/pkg/kernel/lib/text/text_serializer.dart
@@ -372,7 +372,7 @@
   List<Expression> entries =
       new List.filled(2 * expression.entries.length, dummyExpression);
   for (int from = 0, to = 0; from < expression.entries.length; ++from) {
-    MapEntry entry = expression.entries[from];
+    MapLiteralEntry entry = expression.entries[from];
     entries[to++] = entry.key;
     entries[to++] = entry.value;
   }
@@ -380,10 +380,10 @@
 }
 
 MapLiteral wrapMapLiteral(Tuple3<DartType, DartType, List<Expression>> tuple) {
-  List<MapEntry> entries =
-      new List.filled(tuple.third.length ~/ 2, dummyMapEntry);
+  List<MapLiteralEntry> entries =
+      new List.filled(tuple.third.length ~/ 2, dummyMapLiteralEntry);
   for (int from = 0, to = 0; to < entries.length; ++to) {
-    entries[to] = new MapEntry(tuple.third[from++], tuple.third[from++]);
+    entries[to] = new MapLiteralEntry(tuple.third[from++], tuple.third[from++]);
   }
   return new MapLiteral(entries,
       keyType: tuple.first, valueType: tuple.second, isConst: false);
@@ -397,10 +397,10 @@
 
 MapLiteral wrapConstMapLiteral(
     Tuple3<DartType, DartType, List<Expression>> tuple) {
-  List<MapEntry> entries =
-      new List.filled(tuple.third.length ~/ 2, dummyMapEntry);
+  List<MapLiteralEntry> entries =
+      new List.filled(tuple.third.length ~/ 2, dummyMapLiteralEntry);
   for (int from = 0, to = 0; to < entries.length; ++to) {
-    entries[to] = new MapEntry(tuple.third[from++], tuple.third[from++]);
+    entries[to] = new MapLiteralEntry(tuple.third[from++], tuple.third[from++]);
   }
   return new MapLiteral(entries,
       keyType: tuple.first, valueType: tuple.second, isConst: true);
diff --git a/pkg/kernel/lib/type_checker.dart b/pkg/kernel/lib/type_checker.dart
index d078850..e8fa6a3 100644
--- a/pkg/kernel/lib/type_checker.dart
+++ b/pkg/kernel/lib/type_checker.dart
@@ -550,7 +550,7 @@
 
   @override
   DartType visitMapLiteral(MapLiteral node) {
-    for (MapEntry entry in node.entries) {
+    for (MapLiteralEntry entry in node.entries) {
       entry.key = checkAndDowncastExpression(entry.key, node.keyType);
       entry.value = checkAndDowncastExpression(entry.value, node.valueType);
     }
diff --git a/pkg/kernel/lib/visitor.dart b/pkg/kernel/lib/visitor.dart
index c40fde0..b9ca9ac 100644
--- a/pkg/kernel/lib/visitor.dart
+++ b/pkg/kernel/lib/visitor.dart
@@ -319,7 +319,7 @@
   R visitNamedExpression(NamedExpression node) => defaultTreeNode(node);
   R visitSwitchCase(SwitchCase node) => defaultTreeNode(node);
   R visitCatch(Catch node) => defaultTreeNode(node);
-  R visitMapEntry(MapEntry node) => defaultTreeNode(node);
+  R visitMapLiteralEntry(MapLiteralEntry node) => defaultTreeNode(node);
   R visitComponent(Component node) => defaultTreeNode(node);
 }
 
@@ -510,7 +510,8 @@
       defaultTreeNode(node, arg);
   R visitSwitchCase(SwitchCase node, A arg) => defaultTreeNode(node, arg);
   R visitCatch(Catch node, A arg) => defaultTreeNode(node, arg);
-  R visitMapEntry(MapEntry node, A arg) => defaultTreeNode(node, arg);
+  R visitMapLiteralEntry(MapLiteralEntry node, A arg) =>
+      defaultTreeNode(node, arg);
   R visitComponent(Component node, A arg) => defaultTreeNode(node, arg);
 }
 
@@ -1354,12 +1355,13 @@
     transformList(nodes, parent, dummyNamedExpression);
   }
 
-  /// Transforms or removes [MapEntry] nodes in [nodes] as children of [parent].
+  /// Transforms or removes [MapLiteralEntry] nodes in [nodes] as children of
+  /// [parent].
   ///
   /// This is convenience method for calling [transformList] with removal
-  /// sentinel for [MapEntry] nodes.
-  void transformMapEntryList(List<MapEntry> nodes, TreeNode parent) {
-    transformList(nodes, parent, dummyMapEntry);
+  /// sentinel for [MapLiteralEntry] nodes.
+  void transformMapEntryList(List<MapLiteralEntry> nodes, TreeNode parent) {
+    transformList(nodes, parent, dummyMapLiteralEntry);
   }
 
   /// Transforms or removes [Statement] nodes in [nodes] as children of
diff --git a/pkg/vm/lib/target/vm.dart b/pkg/vm/lib/target/vm.dart
index d80ff52..815f38d 100644
--- a/pkg/vm/lib/target/vm.dart
+++ b/pkg/vm/lib/target/vm.dart
@@ -234,9 +234,9 @@
           new StaticInvocation(
               coreTypes.mapUnmodifiable,
               new Arguments([
-                new MapLiteral(new List<MapEntry>.from(
+                new MapLiteral(new List<MapLiteralEntry>.from(
                     arguments.named.map((NamedExpression arg) {
-                  return new MapEntry(
+                  return new MapLiteralEntry(
                       new SymbolLiteral(arg.name)..fileOffset = arg.fileOffset,
                       arg.value)
                     ..fileOffset = arg.fileOffset;
diff --git a/pkg/vm/lib/transformations/ffi.dart b/pkg/vm/lib/transformations/ffi.dart
index b6c00a8..3012c7a 100644
--- a/pkg/vm/lib/transformations/ffi.dart
+++ b/pkg/vm/lib/transformations/ffi.dart
@@ -7,7 +7,7 @@
 
 library vm.transformations.ffi;
 
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 import 'package:kernel/core_types.dart';
 import 'package:kernel/library_index.dart' show LibraryIndex;
diff --git a/pkg/vm/lib/transformations/ffi_definitions.dart b/pkg/vm/lib/transformations/ffi_definitions.dart
index beed450..9225204 100644
--- a/pkg/vm/lib/transformations/ffi_definitions.dart
+++ b/pkg/vm/lib/transformations/ffi_definitions.dart
@@ -23,7 +23,7 @@
         templateFfiSizeAnnotationDimensions,
         templateFfiStructGeneric;
 
-import 'package:kernel/ast.dart' hide MapEntry;
+import 'package:kernel/ast.dart';
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 import 'package:kernel/core_types.dart';
 import 'package:kernel/library_index.dart' show LibraryIndex;
diff --git a/pkg/vm/lib/transformations/type_flow/summary.dart b/pkg/vm/lib/transformations/type_flow/summary.dart
index 20ad897..b8033f9 100644
--- a/pkg/vm/lib/transformations/type_flow/summary.dart
+++ b/pkg/vm/lib/transformations/type_flow/summary.dart
@@ -7,7 +7,8 @@
 
 import 'dart:core' hide Type;
 
-import 'package:kernel/ast.dart' hide Statement, StatementVisitor, MapEntry;
+import 'package:kernel/ast.dart'
+    hide Statement, StatementVisitor, MapLiteralEntry;
 
 import 'calls.dart';
 import 'types.dart';
diff --git a/tools/VERSION b/tools/VERSION
index c93e31d..968abde 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 48
+PRERELEASE 49
 PRERELEASE_PATCH 0
\ No newline at end of file
