diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4eed788a33df716f9733cb1855674aab3e82d290..bfd7505ec4c7ca9a79f80018badb6273e3ba134a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,8 @@
 * Add a machine-readable JSON reporter. For details, see
   [the protocol documentation][json-protocol].
 
+* Skipped groups now properly print skip messages.
+
 [json-protocol]: https://github.com/dart-lang/test/blob/master/json_reporter.md
 
 ## 0.12.5+2
diff --git a/lib/src/backend/group.dart b/lib/src/backend/group.dart
index dc7e6bd38c5f8f3ee607010b02c76f5568509a1b..f1b08a49e1d8000fdbbe2d640f2c675cf95a4ab3 100644
--- a/lib/src/backend/group.dart
+++ b/lib/src/backend/group.dart
@@ -44,14 +44,14 @@ class Group implements GroupEntry {
     if (!metadata.testOn.evaluate(platform, os: os)) return null;
     var newMetadata = metadata.forPlatform(platform, os: os);
     var filtered = _map((entry) => entry.forPlatform(platform, os: os));
-    if (filtered.isEmpty) return null;
+    if (filtered.isEmpty && !entries.isEmpty) return null;
     return new Group(name, filtered,
         metadata: newMetadata, setUpAll: setUpAll, tearDownAll: tearDownAll);
   }
 
   Group filter(bool callback(Test test)) {
     var filtered = _map((entry) => entry.filter(callback));
-    if (filtered.isEmpty) return null;
+    if (filtered.isEmpty && !entries.isEmpty) return null;
     return new Group(name, filtered,
         metadata: metadata, setUpAll: setUpAll, tearDownAll: tearDownAll);
   }
diff --git a/test/runner/compact_reporter_test.dart b/test/runner/compact_reporter_test.dart
index 47b9db9112471c41cda8ad054539ff05e90de1c0..f8908790240c5f3e034dc723d287e5097b40398b 100644
--- a/test/runner/compact_reporter_test.dart
+++ b/test/runner/compact_reporter_test.dart
@@ -322,6 +322,20 @@ void main() {
           +0 ~3: All tests skipped.""");
     });
 
+    test("displays a skipped group", () {
+      _expectReport("""
+          group('skip', () {
+            test('test 1', () {});
+            test('test 2', () {});
+            test('test 3', () {});
+          }, skip: true);""",
+          """
+          +0: loading test.dart
+          +0: skip
+          +0 ~1: skip
+          +0 ~1: All tests skipped.""");
+    });
+
     test("runs skipped tests along with successful tests", () {
       _expectReport("""
           test('skip 1', () {}, skip: true);
diff --git a/test/runner/expanded_reporter_test.dart b/test/runner/expanded_reporter_test.dart
index 11eac9fdb7c6840e3b376ed2a933d4b4bfd101a8..188bc7f0210f891dba6174bc4553a2d857e92efa 100644
--- a/test/runner/expanded_reporter_test.dart
+++ b/test/runner/expanded_reporter_test.dart
@@ -251,6 +251,18 @@ void main() {
           +0 ~3: All tests skipped.""");
     });
 
+    test("displays a skipped group", () {
+      _expectReport("""
+          group('skip', () {
+            test('test 1', () {});
+            test('test 2', () {});
+            test('test 3', () {});
+          }, skip: true);""",
+          """
+          +0: skip
+          +0 ~1: All tests skipped.""");
+    });
+
     test("runs skipped tests along with successful tests", () {
       _expectReport("""
           test('skip 1', () {}, skip: true);