diff --git a/lib/test_reflective_loader.dart b/lib/test_reflective_loader.dart
index 25868d9..6430c66 100644
--- a/lib/test_reflective_loader.dart
+++ b/lib/test_reflective_loader.dart
@@ -27,6 +27,11 @@
 const _ReflectiveTest reflectiveTest = const _ReflectiveTest();
 
 /**
+ * A marker annotation used to annotate test methods that should be skipped.
+ */
+const SkippedTest skippedTest = const SkippedTest();
+
+/**
  * A marker annotation used to annotate "solo" groups and tests.
  */
 const _SoloTest soloTest = const _SoloTest();
@@ -115,14 +120,18 @@
         _hasAnnotationInstance(memberMirror, soloTest);
     // test_
     if (memberName.startsWith('test_')) {
-      group.addTest(isSolo, memberName, memberMirror, () {
-        if (_hasFailingTestAnnotation(memberMirror) ||
-            _isCheckedMode && _hasAssertFailingTestAnnotation(memberMirror)) {
-          return _runFailingTest(classMirror, symbol);
-        } else {
-          return _runTest(classMirror, symbol);
-        }
-      });
+      if (_hasSkippedTestAnnotation(memberMirror)) {
+        group.addSkippedTest(memberName);
+      } else {
+        group.addTest(isSolo, memberName, memberMirror, () {
+          if (_hasFailingTestAnnotation(memberMirror) ||
+              _isCheckedMode && _hasAssertFailingTestAnnotation(memberMirror)) {
+            return _runFailingTest(classMirror, symbol);
+          } else {
+            return _runTest(classMirror, symbol);
+          }
+        });
+      }
       return;
     }
     // solo_test_
@@ -143,6 +152,10 @@
         return _runFailingTest(classMirror, symbol);
       });
     }
+    // skip_test_
+    if (memberName.startsWith('skip_test_')) {
+      group.addSkippedTest(memberName);
+    }
   });
 
   // Support for the case of missing enclosing [defineReflectiveSuite].
@@ -160,7 +173,7 @@
           for (_Test test in group.tests) {
             if (allTests || test.isSolo) {
               test_package.test(test.name, test.function,
-                  timeout: test.timeout);
+                  timeout: test.timeout, skip: test.isSkipped);
             }
           }
         }
@@ -211,6 +224,9 @@
 bool _hasFailingTestAnnotation(MethodMirror method) =>
     _hasAnnotationInstance(method, failingTest);
 
+bool _hasSkippedTestAnnotation(MethodMirror method) =>
+    _hasAnnotationInstance(method, skippedTest);
+
 Future _invokeSymbolIfExists(InstanceMirror instanceMirror, Symbol symbol) {
   var invocationResult = null;
   InstanceMirror closure;
@@ -277,6 +293,19 @@
 }
 
 /**
+ * A marker annotation used to annotate test methods which are skipped.
+ */
+class SkippedTest {
+  /**
+   * Initialize this annotation with the given arguments.
+   *
+   * [issue] is a full URI describing the failure and used for tracking.
+   * [reason] is a free form textual description.
+   */
+  const SkippedTest({String issue, String reason});
+}
+
+/**
  * A marker annotation used to annotate test methods with additional timeout
  * information.
  */
@@ -309,6 +338,11 @@
 
   bool get hasSoloTest => tests.any((test) => test.isSolo);
 
+  void addSkippedTest(String name) {
+    String fullName = _combineNames(this.name, name);
+    tests.add(new _Test.skipped(isSolo, fullName));
+  }
+
   void addTest(bool isSolo, String name, MethodMirror memberMirror,
       _TestFunction function) {
     String fullName = _combineNames(this.name, name);
@@ -341,5 +375,13 @@
   final _TestFunction function;
   final test_package.Timeout timeout;
 
-  _Test(this.isSolo, this.name, this.function, this.timeout);
+  final bool isSkipped;
+
+  _Test(this.isSolo, this.name, this.function, this.timeout)
+      : isSkipped = false;
+
+  _Test.skipped(this.isSolo, this.name)
+      : isSkipped = true,
+        function = null,
+        timeout = null;
 }
diff --git a/test/test_reflective_loader_test.dart b/test/test_reflective_loader_test.dart
index 952fe0a..a657b04 100644
--- a/test/test_reflective_loader_test.dart
+++ b/test/test_reflective_loader_test.dart
@@ -35,4 +35,14 @@
   Future test_fails_throws_async() {
     return new Future.error('foo');
   }
+
+  @skippedTest
+  void test_fails_but_skipped() {
+    throw 'foo';
+  }
+
+  @skippedTest
+  void test_times_out_but_skipped() {
+    while (true) {}
+  }
 }
