diff --git a/pkg/analysis_server/lib/src/services/correction/organize_imports.dart b/pkg/analysis_server/lib/src/services/correction/organize_imports.dart
index 9d77655..22e440b 100644
--- a/pkg/analysis_server/lib/src/services/correction/organize_imports.dart
+++ b/pkg/analysis_server/lib/src/services/correction/organize_imports.dart
@@ -6,6 +6,7 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/error/error.dart';
+import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart'
     hide AnalysisError, Element;
@@ -58,63 +59,59 @@
   /// Organize all [Directive]s.
   void _organizeDirectives() {
     var lineInfo = unit.lineInfo;
+    var hasLibraryDirective = false;
     var directives = <_DirectiveInfo>[];
     for (var directive in unit.directives) {
+      if (directive is LibraryDirective) {
+        hasLibraryDirective = true;
+      }
       if (directive is UriBasedDirective) {
         var priority = getDirectivePriority(directive);
         if (priority != null) {
           var offset = directive.offset;
-          if (directive.beginToken.precedingComments != null) {
-            var firstComment = directive.beginToken.precedingComments;
-            var comment = firstComment;
-            // Don't connect comments that have a blank line between them
-            while (comment.next != null) {
-              var currentLine = lineInfo.getLocation(comment.offset).lineNumber;
-              var nextLine =
-                  lineInfo.getLocation(comment.next.offset).lineNumber;
-              if (nextLine - currentLine > 1) {
-                firstComment = comment.next;
-              }
-
-              comment = comment.next;
-            }
-            // Check if the comment is the first comment in the document
-            if (firstComment != unit.beginToken.precedingComments) {
-              var previousDirectiveLine = lineInfo
-                  .getLocation(directive.beginToken.previous.end)
-                  .lineNumber;
-
-              // Skip over any comments on the same line as the previous directive
-              // as they will be attached to the end of it.
-              var comment = firstComment;
-              while (comment != null &&
-                  previousDirectiveLine ==
-                      lineInfo.getLocation(comment.offset).lineNumber) {
-                comment = comment.next;
-              }
-              if (comment != null) {
-                offset = comment.offset;
-              }
-            }
-          }
-
           var end = directive.end;
-          var line = lineInfo.getLocation(end).lineNumber;
-          Token comment = directive.endToken.next.precedingComments;
-          while (comment != null) {
-            if (lineInfo.getLocation(comment.offset).lineNumber == line) {
-              end = comment.end;
-            }
-            comment = comment.next;
-          }
 
-          var text = code.substring(offset, end);
+          final leadingComment = getLeadingComment(unit, directive, lineInfo);
+          final trailingComment =
+              getTrailingComment(unit, directive, lineInfo, end);
+
+          String leadingCommentText;
+          if (leadingComment != null) {
+            leadingCommentText =
+                code.substring(leadingComment.offset, directive.offset);
+            offset = leadingComment.offset;
+          }
+          String trailingCommentText;
+          if (trailingComment != null) {
+            trailingCommentText =
+                code.substring(directive.end, trailingComment.end);
+            end = trailingComment.end;
+          }
+          String documentationText;
+          if (directive.documentationComment != null) {
+            documentationText = code.substring(
+                directive.documentationComment.offset,
+                directive.documentationComment.end);
+          }
+          String annotationText;
+          if (directive.metadata.beginToken != null) {
+            annotationText = code.substring(
+                directive.metadata.beginToken.offset,
+                directive.metadata.endToken.end);
+          }
+          var text = code.substring(
+              directive.firstTokenAfterCommentAndMetadata.offset,
+              directive.end);
           var uriContent = directive.uri.stringValue;
           directives.add(
             _DirectiveInfo(
               directive,
               priority,
+              leadingCommentText,
+              documentationText,
+              annotationText,
               uriContent,
+              trailingCommentText,
               offset,
               end,
               text,
@@ -129,13 +126,25 @@
     }
     var firstDirectiveOffset = directives.first.offset;
     var lastDirectiveEnd = directives.last.end;
+
+    // Without a library directive, the library comment is the comment of the
+    // first directive.
+    _DirectiveInfo libraryDocumentationDirective;
+    if (!hasLibraryDirective && directives.isNotEmpty) {
+      libraryDocumentationDirective = directives.first;
+    }
+
     // sort
     directives.sort();
     // append directives with grouping
     String directivesCode;
     {
       var sb = StringBuffer();
-      _DirectivePriority currentPriority;
+      if (libraryDocumentationDirective?.documentationText != null) {
+        sb.write(libraryDocumentationDirective.documentationText);
+        sb.write(endOfLine);
+      }
+      var currentPriority = directives.first.priority;
       for (var directiveInfo in directives) {
         if (!hasUnresolvedIdentifierError) {
           var directive = directiveInfo.directive;
@@ -144,12 +153,25 @@
           }
         }
         if (currentPriority != directiveInfo.priority) {
-          if (sb.length != 0) {
-            sb.write(endOfLine);
-          }
+          sb.write(endOfLine);
           currentPriority = directiveInfo.priority;
         }
+        if (directiveInfo.leadingCommentText != null) {
+          sb.write(directiveInfo.leadingCommentText);
+        }
+        if (directiveInfo != libraryDocumentationDirective &&
+            directiveInfo.documentationText != null) {
+          sb.write(directiveInfo.documentationText);
+          sb.write(endOfLine);
+        }
+        if (directiveInfo.annotationText != null) {
+          sb.write(directiveInfo.annotationText);
+          sb.write(endOfLine);
+        }
         sb.write(directiveInfo.text);
+        if (directiveInfo.trailingCommentText != null) {
+          sb.write(directiveInfo.trailingCommentText);
+        }
         sb.write(endOfLine);
       }
       directivesCode = sb.toString();
@@ -162,7 +184,7 @@
   }
 
   static _DirectivePriority getDirectivePriority(UriBasedDirective directive) {
-    var uriContent = directive.uri.stringValue;
+    var uriContent = directive.uri.stringValue ?? '';
     if (directive is ImportDirective) {
       if (uriContent.startsWith('dart:')) {
         return _DirectivePriority.IMPORT_SDK;
@@ -199,26 +221,94 @@
       return '\n';
     }
   }
+
+  /// Gets the first comment token considered to be the leading comment for this
+  /// directive.
+  ///
+  /// Leading comments for the first directive in a file are considered library
+  /// comments and not returned unless they contain blank lines, in which case
+  /// only the last part of the comment will be returned.
+  static Token getLeadingComment(
+      CompilationUnit unit, UriBasedDirective directive, LineInfo lineInfo) {
+    if (directive.beginToken.precedingComments == null) {
+      return null;
+    }
+
+    var firstComment = directive.beginToken.precedingComments;
+    var comment = firstComment;
+    // Don't connect comments that have a blank line between them
+    while (comment.next != null) {
+      var currentLine = lineInfo.getLocation(comment.offset).lineNumber;
+      var nextLine = lineInfo.getLocation(comment.next.offset).lineNumber;
+      if (nextLine - currentLine > 1) {
+        firstComment = comment.next;
+      }
+      comment = comment.next;
+    }
+
+    // Check if the comment is the first comment in the document
+    if (firstComment != unit.beginToken.precedingComments) {
+      var previousDirectiveLine =
+          lineInfo.getLocation(directive.beginToken.previous.end).lineNumber;
+
+      // Skip over any comments on the same line as the previous directive
+      // as they will be attached to the end of it.
+      var comment = firstComment;
+      while (comment != null &&
+          previousDirectiveLine ==
+              lineInfo.getLocation(comment.offset).lineNumber) {
+        comment = comment.next;
+      }
+      return comment;
+    }
+    return null;
+  }
+
+  /// Gets the last comment token considered to be the trailing comment for this
+  /// directive.
+  ///
+  /// To be considered a trailing comment, the comment must be on the same line
+  /// as the directive.
+  static Token getTrailingComment(CompilationUnit unit,
+      UriBasedDirective directive, LineInfo lineInfo, int end) {
+    var line = lineInfo.getLocation(end).lineNumber;
+    Token comment = directive.endToken.next.precedingComments;
+    while (comment != null) {
+      if (lineInfo.getLocation(comment.offset).lineNumber == line) {
+        return comment;
+      }
+      comment = comment.next;
+    }
+    return null;
+  }
 }
 
 class _DirectiveInfo implements Comparable<_DirectiveInfo> {
   final UriBasedDirective directive;
   final _DirectivePriority priority;
+  final String leadingCommentText;
+  final String documentationText;
+  final String annotationText;
   final String uri;
+  final String trailingCommentText;
 
-  /// The offset of the first token, usually the keyword.
+  /// The offset of the first token, usually the keyword but may include leading comments.
   final int offset;
 
-  /// The offset after the least token, including the end-of-line comment.
+  /// The offset after the last token, including the end-of-line comment.
   final int end;
 
-  /// The text between [offset] and [end].
+  /// The text excluding comments, documentation and annotations.
   final String text;
 
   _DirectiveInfo(
     this.directive,
     this.priority,
+    this.leadingCommentText,
+    this.documentationText,
+    this.annotationText,
     this.uri,
+    this.trailingCommentText,
     this.offset,
     this.end,
     this.text,
diff --git a/pkg/analysis_server/lib/src/services/correction/sort_members.dart b/pkg/analysis_server/lib/src/services/correction/sort_members.dart
index 9f5630a..34e0ba4 100644
--- a/pkg/analysis_server/lib/src/services/correction/sort_members.dart
+++ b/pkg/analysis_server/lib/src/services/correction/sort_members.dart
@@ -2,6 +2,7 @@
 // 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:analysis_server/src/services/correction/organize_imports.dart';
 import 'package:analysis_server/src/utilities/strings.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Element;
@@ -143,117 +144,10 @@
 
   /// Sorts all [Directive]s.
   void _sortUnitDirectives() {
-    var hasLibraryDirective = false;
-    var directives = <_DirectiveInfo>[];
-    for (var directive in unit.directives) {
-      if (directive is LibraryDirective) {
-        hasLibraryDirective = true;
-      }
-      if (directive is! UriBasedDirective) {
-        continue;
-      }
-      var uriDirective = directive as UriBasedDirective;
-      var uriContent = uriDirective.uri.stringValue ?? '';
-      _DirectivePriority kind;
-      if (directive is ImportDirective) {
-        if (uriContent.startsWith('dart:')) {
-          kind = _DirectivePriority.IMPORT_SDK;
-        } else if (uriContent.startsWith('package:')) {
-          kind = _DirectivePriority.IMPORT_PKG;
-        } else if (uriContent.contains('://')) {
-          kind = _DirectivePriority.IMPORT_OTHER;
-        } else {
-          kind = _DirectivePriority.IMPORT_REL;
-        }
-      }
-      if (directive is ExportDirective) {
-        if (uriContent.startsWith('dart:')) {
-          kind = _DirectivePriority.EXPORT_SDK;
-        } else if (uriContent.startsWith('package:')) {
-          kind = _DirectivePriority.EXPORT_PKG;
-        } else if (uriContent.contains('://')) {
-          kind = _DirectivePriority.EXPORT_OTHER;
-        } else {
-          kind = _DirectivePriority.EXPORT_REL;
-        }
-      }
-      if (directive is PartDirective) {
-        kind = _DirectivePriority.PART;
-      }
-      if (kind != null) {
-        String documentationText;
-        if (directive.documentationComment != null) {
-          documentationText = code.substring(
-              directive.documentationComment.offset,
-              directive.documentationComment.end);
-        }
-        String annotationText;
-        if (directive.metadata.beginToken != null) {
-          annotationText = code.substring(directive.metadata.beginToken.offset,
-              directive.metadata.endToken.end);
-        }
-        var offset = directive.firstTokenAfterCommentAndMetadata.offset;
-        var length = directive.end - offset;
-        var text = code.substring(offset, offset + length);
-        directives.add(_DirectiveInfo(directive, kind, uriContent,
-            documentationText, annotationText, text));
-      }
-    }
-    // nothing to do
-    if (directives.isEmpty) {
-      return;
-    }
-    var firstDirectiveOffset = directives[0].directive.offset;
-    var lastDirectiveEnd = directives[directives.length - 1].directive.end;
-    // Without a library directive, the library comment is the comment of the
-    // first directive.
-    _DirectiveInfo libraryDocumentationDirective;
-    if (!hasLibraryDirective && directives.isNotEmpty) {
-      libraryDocumentationDirective = directives.first;
-    }
-    // do sort
-    directives.sort();
-    // append directives with grouping
-    String directivesCode;
-    {
-      var sb = StringBuffer();
-      var endOfLine = this.endOfLine;
-      _DirectivePriority currentPriority;
-      var firstOutputDirective = true;
-      for (var directive in directives) {
-        if (currentPriority != directive.priority) {
-          if (sb.length != 0) {
-            sb.write(endOfLine);
-          }
-          currentPriority = directive.priority;
-        }
-        if (directive != libraryDocumentationDirective &&
-            directive.documentationText != null) {
-          sb.write(directive.documentationText);
-          sb.write(endOfLine);
-        }
-        if (firstOutputDirective) {
-          firstOutputDirective = false;
-          if (libraryDocumentationDirective != null &&
-              libraryDocumentationDirective.documentationText != null) {
-            sb.write(libraryDocumentationDirective.documentationText);
-            sb.write(endOfLine);
-          }
-        }
-        if (directive.annotationText != null) {
-          sb.write(directive.annotationText);
-          sb.write(endOfLine);
-        }
-        sb.write(directive.text);
-        sb.write(endOfLine);
-      }
-      directivesCode = sb.toString();
-      directivesCode = directivesCode.trimRight();
-    }
-    // prepare code
-    var beforeDirectives = code.substring(0, firstDirectiveOffset);
-    var afterDirectives = code.substring(lastDirectiveEnd);
-    code = beforeDirectives + directivesCode + afterDirectives;
+    final importOrganizer =
+        ImportOrganizer(code, unit, [], removeUnused: false);
+    importOrganizer.organize();
+    code = importOrganizer.code;
   }
 
   /// Sorts all [CompilationUnitMember]s.
@@ -360,68 +254,6 @@
   }
 }
 
-class _DirectiveInfo implements Comparable<_DirectiveInfo> {
-  final Directive directive;
-  final _DirectivePriority priority;
-  final String uri;
-  final String documentationText;
-  final String annotationText;
-  final String text;
-
-  _DirectiveInfo(this.directive, this.priority, this.uri,
-      this.documentationText, this.annotationText, this.text);
-
-  @override
-  int compareTo(_DirectiveInfo other) {
-    if (priority == other.priority) {
-      return _compareUri(uri, other.uri);
-    }
-    return priority.ordinal - other.priority.ordinal;
-  }
-
-  @override
-  String toString() => '(priority=$priority; text=$text)';
-
-  static int _compareUri(String a, String b) {
-    var aList = _splitUri(a);
-    var bList = _splitUri(b);
-    int result;
-    if ((result = aList[0].compareTo(bList[0])) != 0) return result;
-    if ((result = aList[1].compareTo(bList[1])) != 0) return result;
-    return 0;
-  }
-
-  /// Split the given [uri] like `package:some.name/and/path.dart` into a list
-  /// like `[package:some.name, and/path.dart]`.
-  static List<String> _splitUri(String uri) {
-    var index = uri.indexOf('/');
-    if (index == -1) {
-      return <String>[uri, ''];
-    }
-    return <String>[uri.substring(0, index), uri.substring(index + 1)];
-  }
-}
-
-class _DirectivePriority {
-  static const IMPORT_SDK = _DirectivePriority('IMPORT_SDK', 0);
-  static const IMPORT_PKG = _DirectivePriority('IMPORT_PKG', 1);
-  static const IMPORT_OTHER = _DirectivePriority('IMPORT_OTHER', 2);
-  static const IMPORT_REL = _DirectivePriority('IMPORT_REL', 3);
-  static const EXPORT_SDK = _DirectivePriority('EXPORT_SDK', 4);
-  static const EXPORT_PKG = _DirectivePriority('EXPORT_PKG', 5);
-  static const EXPORT_OTHER = _DirectivePriority('EXPORT_OTHER', 6);
-  static const EXPORT_REL = _DirectivePriority('EXPORT_REL', 7);
-  static const PART = _DirectivePriority('PART', 8);
-
-  final String name;
-  final int ordinal;
-
-  const _DirectivePriority(this.name, this.ordinal);
-
-  @override
-  String toString() => name;
-}
-
 class _MemberInfo {
   final _PriorityItem item;
   final String name;
diff --git a/pkg/analysis_server/test/services/correction/organize_directives_test.dart b/pkg/analysis_server/test/services/correction/organize_directives_test.dart
index c2e47ac..9315f3a 100644
--- a/pkg/analysis_server/test/services/correction/organize_directives_test.dart
+++ b/pkg/analysis_server/test/services/correction/organize_directives_test.dart
@@ -260,6 +260,162 @@
 ''');
   }
 
+  Future<void> test_sort_commentsAnnotations_library() async {
+    await _computeUnitAndErrors(r'''
+// Library docs 1
+// Library docs 2
+library foo;
+
+// Import c comment
+@annotation
+import 'c.dart'; // Trailing comment C
+// Import b comment
+@annotation
+import 'b.dart'; // Trailing comment B
+// Import a comment
+@annotation
+import 'a.dart'; // Trailing comment A
+
+/** doc */
+main() {
+}
+''');
+    // validate change
+    _assertOrganize(r'''
+// Library docs 1
+// Library docs 2
+library foo;
+
+// Import a comment
+@annotation
+import 'a.dart'; // Trailing comment A
+// Import b comment
+@annotation
+import 'b.dart'; // Trailing comment B
+// Import c comment
+@annotation
+import 'c.dart'; // Trailing comment C
+
+/** doc */
+main() {
+}
+''');
+  }
+
+  Future<void> test_sort_commentsAnnotations_noLibrary() async {
+    await _computeUnitAndErrors(r'''
+// Library docs 1
+// Library docs 2
+@annotation
+import 'c.dart'; // Trailing comment C
+// Import b comment
+@annotation
+import 'b.dart'; // Trailing comment B
+// Import a comment
+@annotation
+import 'a.dart'; // Trailing comment A
+
+/** doc */
+main() {
+}
+''');
+    // validate change
+    _assertOrganize(r'''
+// Library docs 1
+// Library docs 2
+// Import a comment
+@annotation
+import 'a.dart'; // Trailing comment A
+// Import b comment
+@annotation
+import 'b.dart'; // Trailing comment B
+@annotation
+import 'c.dart'; // Trailing comment C
+
+/** doc */
+main() {
+}
+''');
+  }
+
+  Future<void> test_sort_documentationAnnotations_library() async {
+    await _computeUnitAndErrors(r'''
+/// Library docs 1
+/// Library docs 2
+library foo;
+
+/// Import c docs
+@annotation
+import 'c.dart'; // Trailing comment C
+/// Import b docs
+@annotation
+import 'b.dart'; // Trailing comment B
+/// Import a docs
+@annotation
+import 'a.dart'; // Trailing comment A
+
+/** doc */
+main() {
+}
+''');
+    // validate change
+    _assertOrganize(r'''
+/// Library docs 1
+/// Library docs 2
+library foo;
+
+/// Import a docs
+@annotation
+import 'a.dart'; // Trailing comment A
+/// Import b docs
+@annotation
+import 'b.dart'; // Trailing comment B
+/// Import c docs
+@annotation
+import 'c.dart'; // Trailing comment C
+
+/** doc */
+main() {
+}
+''');
+  }
+
+  Future<void> test_sort_documentationAnnotations_noLibrary() async {
+    await _computeUnitAndErrors(r'''
+/// Library docs 1
+/// Library docs 2
+@annotation
+import 'c.dart'; // Trailing comment C
+/// Import b docs
+@annotation
+import 'b.dart'; // Trailing comment B
+/// Import a docs
+@annotation
+import 'a.dart'; // Trailing comment A
+
+/** doc */
+main() {
+}
+''');
+    // validate change
+    _assertOrganize(r'''
+/// Library docs 1
+/// Library docs 2
+/// Import a docs
+@annotation
+import 'a.dart'; // Trailing comment A
+/// Import b docs
+@annotation
+import 'b.dart'; // Trailing comment B
+@annotation
+import 'c.dart'; // Trailing comment C
+
+/** doc */
+main() {
+}
+''');
+  }
+
   Future<void> test_sort_hasComments() async {
     await _computeUnitAndErrors(r'''
 // header
diff --git a/pkg/analysis_server/test/services/correction/sort_members_test.dart b/pkg/analysis_server/test/services/correction/sort_members_test.dart
index 64d74cc..4c50509 100644
--- a/pkg/analysis_server/test/services/correction/sort_members_test.dart
+++ b/pkg/analysis_server/test/services/correction/sort_members_test.dart
@@ -448,10 +448,10 @@
 ''');
     // validate change
     _assertSort(r'''
-/// aaa1
-/// aaa2
 /// Library documentation comment A
 /// Library documentation comment B
+/// aaa1
+/// aaa2
 import 'a.dart';
 import 'b.dart';
 ''');
@@ -473,13 +473,13 @@
     // validate change
     _assertSort(r'''
 /**
- * aaa
- * aaa
- */
-/**
  * Library documentation comment A.
  * Library documentation comment B.
  */
+/**
+ * aaa
+ * aaa
+ */
 import 'a.dart';
 import 'b.dart';
 ''');
@@ -527,6 +527,32 @@
 ''');
   }
 
+  Future<void> test_directives_splits_comments() async {
+    // Here, the comments "b" and "ccc1" will be part of the same list
+    // of comments so need to be split.
+    await _parseTestUnit(r'''
+// copyright
+import 'b.dart'; // b
+// ccc1
+// ccc2
+import 'c.dart'; // c
+// aaa1
+// aaa2
+import 'a.dart'; // a
+''');
+
+    _assertSort(r'''
+// copyright
+// aaa1
+// aaa2
+import 'a.dart'; // a
+import 'b.dart'; // b
+// ccc1
+// ccc2
+import 'c.dart'; // c
+''');
+  }
+
   Future<void> test_mixinMembers_method() async {
     await _parseTestUnit(r'''
 mixin A {
diff --git a/runtime/include/dart_tools_api.h b/runtime/include/dart_tools_api.h
index c7ebb49..a106d42 100644
--- a/runtime/include/dart_tools_api.h
+++ b/runtime/include/dart_tools_api.h
@@ -271,23 +271,28 @@
 /**
  * Usage statistics for a space/generation at a particular moment in time.
  *
- * \param new_space Data for New Space.
+ * \param used Amount of memory used, in bytes.
  *
- * \param old_space Data for Old Space.
+ * \param capacity Memory capacity, in bytes.
+ *
+ * \param external External memory, in bytes.
+ *
+ * \param collections How many times the garbage collector has run in this
+ *   space.
+ *
+ * \param time Cumulative time spent collecting garbage in this space, in
+ *   seconds.
+ *
+ * \param avg_collection_period Average time between garbage collector running
+ *   in this space, in milliseconds.
  */
 typedef struct {
-  /**
-   * \param used_in_words Amount of memory space used, in words.
-   *
-   * \param capacity_in_words Memory space capacity, in words.
-   *
-   * \param external_in_words External memory, in words.
-   */
-  struct {
-    intptr_t used_in_words;
-    intptr_t capacity_in_words;
-    intptr_t external_in_words;
-  } new_space, old_space;
+  intptr_t used;
+  intptr_t capacity;
+  intptr_t external;
+  intptr_t collections;
+  double time;
+  double avg_collection_period;
 } Dart_GCStats;
 
 /**
@@ -297,15 +302,17 @@
  *
  * \param reason The reason for the GC event. Static lifetime.
  *
- * \param before Memory usage statistics measured before GC was performed.
+ * \param new_space Data for New Space.
  *
- * \param before Memory usage statistics measured after GC was performed.
+ * \param old_space Data for Old Space.
  */
 typedef struct {
   const char* type;
   const char* reason;
-  Dart_GCStats before;
-  Dart_GCStats after;
+  const char* isolate_id;
+
+  Dart_GCStats new_space;
+  Dart_GCStats old_space;
 } Dart_GCEvent;
 
 /**
diff --git a/runtime/vm/heap/heap.cc b/runtime/vm/heap/heap.cc
index 51031cc..dad7079 100644
--- a/runtime/vm/heap/heap.cc
+++ b/runtime/vm/heap/heap.cc
@@ -994,6 +994,14 @@
     stats_.data_[i] = 0;
 }
 
+static double AvgCollectionPeriod(int64_t run_time, intptr_t collections) {
+  if (collections <= 0 || run_time <= 0) {
+    return 0.0;
+  }
+  return MicrosecondsToMilliseconds(run_time) /
+         static_cast<double>(collections);
+}
+
 void Heap::RecordAfterGC(GCType type) {
   stats_.after_.micros_ = OS::GetCurrentMonotonicMicros();
   int64_t delta = stats_.after_.micros_ - stats_.before_.micros_;
@@ -1019,33 +1027,54 @@
   }
 #endif  // !PRODUCT
   if (gc_event_callback_ != nullptr) {
-    Dart_GCEvent event;
+    isolate_group_->ForEachIsolate([&](Isolate* isolate) {
+      if (!Isolate::IsSystemIsolate(isolate)) {
+        Dart_GCEvent event;
+        auto isolate_id = Utils::CStringUniquePtr(
+            OS::SCreate(nullptr, ISOLATE_SERVICE_ID_FORMAT_STRING,
+                        isolate->main_port()),
+            std::free);
+        int64_t isolate_uptime_micros = isolate->UptimeMicros();
 
-    event.type = GCTypeToString(stats_.type_);
-    event.reason = GCReasonToString(stats_.reason_);
+        event.isolate_id = isolate_id.get();
+        event.type = GCTypeToString(stats_.type_);
+        event.reason = GCReasonToString(stats_.reason_);
 
-    event.before.new_space.capacity_in_words =
-        stats_.before_.new_.capacity_in_words;
-    event.before.new_space.external_in_words =
-        stats_.before_.new_.external_in_words;
-    event.before.new_space.used_in_words = stats_.before_.new_.used_in_words;
-    event.before.old_space.capacity_in_words =
-        stats_.before_.old_.capacity_in_words;
-    event.before.old_space.external_in_words =
-        stats_.before_.old_.external_in_words;
-    event.before.old_space.used_in_words = stats_.before_.old_.used_in_words;
-    event.after.new_space.capacity_in_words =
-        stats_.after_.new_.capacity_in_words;
-    event.after.new_space.external_in_words =
-        stats_.after_.new_.external_in_words;
-    event.after.new_space.used_in_words = stats_.after_.new_.used_in_words;
-    event.after.old_space.capacity_in_words =
-        stats_.after_.old_.capacity_in_words;
-    event.after.old_space.external_in_words =
-        stats_.after_.old_.external_in_words;
-    event.after.old_space.used_in_words = stats_.after_.old_.used_in_words;
+        // New space - Scavenger.
+        {
+          intptr_t new_space_collections = new_space_.collections();
 
-    (*gc_event_callback_)(&event);
+          event.new_space.collections = new_space_collections;
+          event.new_space.used = stats_.after_.new_.used_in_words * kWordSize;
+          event.new_space.capacity =
+              stats_.after_.new_.capacity_in_words * kWordSize;
+          event.new_space.external =
+              stats_.after_.new_.external_in_words * kWordSize;
+          event.new_space.time =
+              MicrosecondsToSeconds(new_space_.gc_time_micros());
+          event.new_space.avg_collection_period =
+              AvgCollectionPeriod(isolate_uptime_micros, new_space_collections);
+        }
+
+        // Old space - Page.
+        {
+          intptr_t old_space_collections = old_space_.collections();
+
+          event.old_space.collections = old_space_collections;
+          event.old_space.used = stats_.after_.old_.used_in_words * kWordSize;
+          event.old_space.capacity =
+              stats_.after_.old_.capacity_in_words * kWordSize;
+          event.old_space.external =
+              stats_.after_.old_.external_in_words * kWordSize;
+          event.old_space.time =
+              MicrosecondsToSeconds(old_space_.gc_time_micros());
+          event.old_space.avg_collection_period =
+              AvgCollectionPeriod(isolate_uptime_micros, old_space_collections);
+        }
+
+        (*gc_event_callback_)(&event);
+      }
+    });
   }
 }
 
diff --git a/tests/co19/co19-co19.status b/tests/co19/co19-co19.status
index 76666e6..4bfc333 100644
--- a/tests/co19/co19-co19.status
+++ b/tests/co19/co19-co19.status
@@ -43,10 +43,9 @@
 LanguageFeatures/Simple-bounds/static/*: Skip # Not migrated to NNBD
 LanguageFeatures/Simple-bounds/static/type-aliases/*: Skip # Not migrated to NNBD
 LanguageFeatures/Spread-collections/*: Skip # Not migrated to NNBD
-LanguageFeatures/Super-bounded-types/*: Skip # Not migrated to NNBD
-LanguageFeatures/Triple-Shift/*: Skip # Not migrated to NNBD
+LanguageFeatures/Triple-Shift/*: Skip # Triple shift is not implemented yet
 LanguageFeatures/int-to-double/*: Skip # Not migrated to NNBD
-LanguageFeatures/regression/*: Skip # Not migrated to NNBD
+LanguageFeatures/regression/34560_t02/01: Skip # Type aliases are not fully implemented
 LibTest/html/CanvasRenderingContext2D/*: Skip # Not migrated to NNBD
 LibTest/html/Document/*: Skip # Not migrated to NNBD
 LibTest/html/Element/*: Skip # Not migrated to NNBD
@@ -57,7 +56,6 @@
 LibTest/html/Node/*: Skip # Not migrated to NNBD
 LibTest/html/Window/*: Skip # Not migrated to NNBD
 LibTest/io/RawDatagramSocket/*: Skip # https://github.com/dart-lang/co19/issues/195
-Utils/tests/Expect/*: Skip # Not migrated to NNBD
 
 [ $compiler == dart2analyzer ]
 Language/Classes/Instance_Methods/Operators/allowed_names_t01: Skip # Triple shift is not fully implemented
diff --git a/tools/VERSION b/tools/VERSION
index 33b7687..7ec9e7a 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 10
 PATCH 0
-PRERELEASE 106
+PRERELEASE 107
 PRERELEASE_PATCH 0
\ No newline at end of file
