diff --git a/packages/charted/lib/charts/data_transformers/aggregation.dart b/packages/charted/lib/charts/data_transformers/aggregation.dart
index 9633777..e48840a 100644
--- a/packages/charted/lib/charts/data_transformers/aggregation.dart
+++ b/packages/charted/lib/charts/data_transformers/aggregation.dart
@@ -312,7 +312,7 @@
         for (int fi = 0; fi < factsCount; fi++) {
           var value = factsAccessor(item, _factFields[fi]);
           _factsCache[factsDataOffset + fi] =
-              (value == null) ? double.NAN : (value as num).toDouble();
+              (value == null) ? double.nan : (value as num).toDouble();
         }
       }
 
diff --git a/packages/charted/lib/charts/layout_renderers/pie_chart_renderer.dart b/packages/charted/lib/charts/layout_renderers/pie_chart_renderer.dart
index 44727cb..cd46227 100644
--- a/packages/charted/lib/charts/layout_renderers/pie_chart_renderer.dart
+++ b/packages/charted/lib/charts/layout_renderers/pie_chart_renderer.dart
@@ -161,7 +161,7 @@
           label: row.elementAt(dimension) as String,
           series: [series],
           value:
-              '${(((d.endAngle - d.startAngle) * 50) / math.PI).toStringAsFixed(2)}%');
+              '${(((d.endAngle - d.startAngle) * 50) / math.pi).toStringAsFixed(2)}%');
     });
     return _legend..addAll(area.config.isRTL ? items.reversed : items);
   }
diff --git a/packages/charted/lib/core/interpolators/easing.dart b/packages/charted/lib/core/interpolators/easing.dart
index 37f0117..d1f7c2d 100644
--- a/packages/charted/lib/core/interpolators/easing.dart
+++ b/packages/charted/lib/core/interpolators/easing.dart
@@ -55,9 +55,9 @@
 EasingFunction easePoly([num e = 1]) => (t) => math.pow(t, e);
 
 EasingFunction easeElastic([num a = 1, num p = 0.45]) {
-  num s = p / 2 * math.PI * math.asin(1 / a);
+  num s = p / 2 * math.pi * math.asin(1 / a);
   return (t) =>
-      1 + a * math.pow(2, -10 * t) * math.sin((t - s) * 2 * math.PI / p);
+      1 + a * math.pow(2, -10 * t) * math.sin((t - s) * 2 * math.pi / p);
 }
 
 EasingFunction easeBack([num s = 1.70158]) =>
@@ -74,7 +74,7 @@
       return 4 * (t < .5 ? t3 : 3 * (t - t2) + t3 - .75);
     };
 
-EasingFunction easeSin() => (num t) => 1 - math.cos(t * math.PI / 2);
+EasingFunction easeSin() => (num t) => 1 - math.cos(t * math.pi / 2);
 
 EasingFunction easeExp() => (num t) => math.pow(2, 10 * (t - 1));
 
diff --git a/packages/charted/lib/core/interpolators/interpolators.dart b/packages/charted/lib/core/interpolators/interpolators.dart
index 89b8c29..e88d00d 100644
--- a/packages/charted/lib/core/interpolators/interpolators.dart
+++ b/packages/charted/lib/core/interpolators/interpolators.dart
@@ -335,7 +335,7 @@
   if (a == null || b == null) return (t) => b;
   assert(a.length == b.length && a.length == 3);
 
-  var sqrt2 = math.SQRT2, param2 = 2, param4 = 4;
+  var sqrt2 = math.sqrt2, param2 = 2, param4 = 4;
 
   num ux0 = a[0], uy0 = a[1], w0 = a[2], ux1 = b[0], uy1 = b[1], w1 = b[2];
 
diff --git a/packages/charted/lib/core/scales/linear_scale.dart b/packages/charted/lib/core/scales/linear_scale.dart
index 2a5a387..13c248a 100644
--- a/packages/charted/lib/core/scales/linear_scale.dart
+++ b/packages/charted/lib/core/scales/linear_scale.dart
@@ -178,20 +178,20 @@
           ? 1
           : math.pow(
               10,
-              (math.log(extent.max.abs() / forcedTicksCount) / math.LN10)
+              (math.log(extent.max.abs() / forcedTicksCount) / math.ln10)
                   .floor());
       num max = (extent.max / maxFactor).ceil() * maxFactor;
       num minFactor = extent.min == 0
           ? 1
           : math.pow(
               10,
-              (math.log(extent.min.abs() / forcedTicksCount) / math.LN10)
+              (math.log(extent.min.abs() / forcedTicksCount) / math.ln10)
                   .floor());
       num min = (extent.min / minFactor).floor() * minFactor;
       step = (max - min) / forcedTicksCount;
       return new Range(min, max + step * 0.5, step);
     } else {
-      step = math.pow(10, (math.log(span / _ticksCount) / math.LN10).floor());
+      step = math.pow(10, (math.log(span / _ticksCount) / math.ln10).floor());
       var err = _ticksCount / span * step;
 
       // Filter ticks to get closer to the desired count.
@@ -212,7 +212,7 @@
   FormatFunction createTickFormatter([String formatStr]) {
     if (formatStr == null) {
       int precision(num value) {
-        return -(math.log(value) / math.LN10 + .01).floor();
+        return -(math.log(value) / math.ln10 + .01).floor();
       }
 
       Range tickRange = _linearTickRange();
diff --git a/packages/charted/lib/core/utils/math.dart b/packages/charted/lib/core/utils/math.dart
index 7b8206c..30df139 100644
--- a/packages/charted/lib/core/utils/math.dart
+++ b/packages/charted/lib/core/utils/math.dart
@@ -9,14 +9,14 @@
 part of charted.core.utils;
 
 /// Mathematical constant PI
-const double PI = math.PI;
+const double pi = math.pi;
 
 /// PI * 0.5
-const double HALF_PI = PI / 2.0;
+const double HALF_PI = pi / 2.0;
 
 /// PI * 2
 /// Ratio constant of a circle's circumference to radius
-const double TAU = PI * 2.0;
+const double TAU = pi * 2.0;
 
 /// An arbitrary small possible number
 const double EPSILON = 1e-6;
@@ -42,7 +42,7 @@
 num tanh(num x) => ((x = math.exp(2 * x)) - 1) / (x + 1);
 
 /// Converts [degrees] to radians.
-num toRadians(num degrees) => degrees * math.PI / 180.0;
+num toRadians(num degrees) => degrees * math.pi / 180.0;
 
 /// Converts [radians] to degrees.
-num toDegrees(num radians) => radians * 180.0 / math.PI;
+num toDegrees(num radians) => radians * 180.0 / math.pi;
diff --git a/packages/charted/lib/layout/src/pie_layout.dart b/packages/charted/lib/layout/src/pie_layout.dart
index 5d56e04..3c59d2d 100644
--- a/packages/charted/lib/layout/src/pie_layout.dart
+++ b/packages/charted/lib/layout/src/pie_layout.dart
@@ -84,5 +84,5 @@
   static num defaultStartAngleCallback(d, i, _) => 0;
 
   /** Default end angle callback - returns 2 * PI */
-  static num defaultEndAngleCallback(d, i, _) => 2 * PI;
+  static num defaultEndAngleCallback(d, i, _) => 2 * pi;
 }
diff --git a/packages/charted/lib/layout/src/treemap_layout.dart b/packages/charted/lib/layout/src/treemap_layout.dart
index 4a01020..80b526f 100644
--- a/packages/charted/lib/layout/src/treemap_layout.dart
+++ b/packages/charted/lib/layout/src/treemap_layout.dart
@@ -138,7 +138,7 @@
 
   /// Computes the most amount of area needed to layout the list of nodes.
   num _worst(List<TreeMapNode> nodes, num length, num pArea) {
-    num area, rmax = 0, rmin = double.INFINITY;
+    num area, rmax = 0, rmin = double.infinity;
     for (var node in nodes) {
       area = node.area;
       if (area <= 0) continue;
@@ -150,7 +150,7 @@
     return (pArea > 0)
         ? math.max(
             length * rmax * ratio / pArea, pArea / (length * rmin * ratio))
-        : double.INFINITY;
+        : double.infinity;
   }
 
   /// Recursively compute each nodes (and its children nodes) position and size
@@ -164,7 +164,7 @@
       var remaining = new List<TreeMapNode>.from(children);
       int n;
       num score,
-          best = double.INFINITY,
+          best = double.infinity,
           length = (mode == TREEMAP_LAYOUT_SLICE)
               ? rect.width
               : (mode == TREEMAP_LAYOUT_DICE)
@@ -187,7 +187,7 @@
           length = math.min(rect.width, rect.height);
           nodes.clear();
           area = 0;
-          best = double.INFINITY;
+          best = double.infinity;
         }
       }
       if (nodes.isNotEmpty) {
diff --git a/packages/charted/lib/locale/format.dart b/packages/charted/lib/locale/format.dart
index 0ecbee6..d9c9d1f 100644
--- a/packages/charted/lib/locale/format.dart
+++ b/packages/charted/lib/locale/format.dart
@@ -71,7 +71,7 @@
     }
 
     // Determining SI scale of the value in increment of 1000.
-    i = 1 + (1e-12 + math.log(value) / math.LN10).floor();
+    i = 1 + (1e-12 + math.log(value) / math.ln10).floor();
     i = math.max(-24, math.min(24, ((i - 1) / 3).floor() * 3));
     i = 8 + (i / 3).floor();
 
@@ -82,7 +82,7 @@
   }
 
   num _formatPrecision(num x, num p) {
-    return p - (x != 0 ? (math.log(x) / math.LN10).ceil() : 1);
+    return p - (x != 0 ? (math.log(x) / math.ln10).ceil() : 1);
   }
 
   /** Returns the value of x rounded to the nth digit. */
diff --git a/packages/charted/lib/svg/shapes/arc.dart b/packages/charted/lib/svg/shapes/arc.dart
index a842449..5a040e2 100644
--- a/packages/charted/lib/svg/shapes/arc.dart
+++ b/packages/charted/lib/svg/shapes/arc.dart
@@ -67,7 +67,7 @@
         se = math.sin(ea),
         cs = math.cos(sa),
         ce = math.cos(ea),
-        df = delta < PI ? 0 : 1;
+        df = delta < pi ? 0 : 1;
 
     return ir > 0
         ? "M${or * cs},${or * ss}"
@@ -84,7 +84,7 @@
   List centroid(d, int i, Element e) {
     var r = (innerRadiusCallback(d, i, e) + outerRadiusCallback(d, i, e)) / 2,
         a = (startAngleCallback(d, i, e) + endAngleCallback(d, i, e)) / 2 -
-            math.PI / 2;
+            math.pi / 2;
     return [math.cos(a) * r, math.sin(a) * r];
   }
 
diff --git a/packages/charted/test.disabled/core/math_test.dart b/packages/charted/test.disabled/core/math_test.dart
index a617d87..8b05d3b 100644
--- a/packages/charted/test.disabled/core/math_test.dart
+++ b/packages/charted/test.disabled/core/math_test.dart
@@ -11,20 +11,20 @@
 testMath() {
   test('toRadius() correctly converts degrees to radians', () {
     expect(toRadians(0), equals(0));
-    expect(toRadians(180), equals(math.PI));
-    expect(toRadians(360), equals(math.PI * 2));
-    expect(toRadians(90), equals(math.PI / 2));
-    expect(toRadians(30), equals(math.PI / 6));
-    expect(toRadians(45), equals(math.PI / 4));
+    expect(toRadians(180), equals(math.pi));
+    expect(toRadians(360), equals(math.pi * 2));
+    expect(toRadians(90), equals(math.pi / 2));
+    expect(toRadians(30), equals(math.pi / 6));
+    expect(toRadians(45), equals(math.pi / 4));
   });
 
   test('toDegrees() correctly converts radians to degrees', () {
     expect(toDegrees(0), closeTo(0, EPSILON));
-    expect(toDegrees(math.PI), closeTo(180, EPSILON));
-    expect(toDegrees(math.PI * 2), closeTo(360, EPSILON));
-    expect(toDegrees(math.PI / 2), closeTo(90, EPSILON));
-    expect(toDegrees(math.PI / 6), closeTo(30, EPSILON));
-    expect(toDegrees(math.PI / 4), closeTo(45, EPSILON));
+    expect(toDegrees(math.pi), closeTo(180, EPSILON));
+    expect(toDegrees(math.pi * 2), closeTo(360, EPSILON));
+    expect(toDegrees(math.pi / 2), closeTo(90, EPSILON));
+    expect(toDegrees(math.pi / 6), closeTo(30, EPSILON));
+    expect(toDegrees(math.pi / 4), closeTo(45, EPSILON));
   });
 
   test('sinh() correctly calculates sinh', () {
diff --git a/packages/charted/test.disabled/layout/pie_layout_test.dart b/packages/charted/test.disabled/layout/pie_layout_test.dart
index 12fd137..62b9260 100644
--- a/packages/charted/test.disabled/layout/pie_layout_test.dart
+++ b/packages/charted/test.disabled/layout/pie_layout_test.dart
@@ -16,10 +16,10 @@
     [10, 5, 5],       // Case for sorting, results the same as the first case.
   ];
   List mockPieAngle = [
-    [[0, PI / 2], [PI / 2, PI], [PI, PI * 2]],
+    [[0, pi / 2], [pi / 2, pi], [pi, pi * 2]],
     [[0, 0], [0, 0]],
-    [[0, 2 * PI]],
-    [[0, PI / 2], [PI / 2, PI], [PI, PI * 2]],
+    [[0, 2 * pi]],
+    [[0, pi / 2], [pi / 2, pi], [pi, pi * 2]],
   ];
 
   group('PieLayout.startAngleCallback', () {
@@ -37,7 +37,7 @@
   group('PieLayout.endAngleCallback', () {
     PieLayout pieLayout = new PieLayout();
     test('= 2 * PI by default', () {
-      expect(pieLayout.endAngleCallback(null, 0, null), equals(2 * PI));
+      expect(pieLayout.endAngleCallback(null, 0, null), equals(2 * pi));
     });
     PieLayout pieLayout2 = new PieLayout();
     pieLayout2.endAngle = 0.4;
diff --git a/packages/charted/test.disabled/svg/svg_arc_test.dart b/packages/charted/test.disabled/svg/svg_arc_test.dart
index 3dbed95..d92be0e 100644
--- a/packages/charted/test.disabled/svg/svg_arc_test.dart
+++ b/packages/charted/test.disabled/svg/svg_arc_test.dart
@@ -13,12 +13,12 @@
   List mockSvgData = [
     new SvgArcData(null, 0, 0,      0,      0,  100),  // Init sector
     new SvgArcData(null, 0, 0,      0,      50, 100),  // Init donut
-    new SvgArcData(null, 0, 0,      2 * PI, 0,  100),  // Whole sector
-    new SvgArcData(null, 0, 0,      2 * PI, 50, 100),  // Whole donut
-    new SvgArcData(null, 0, 0,      PI / 3, 0,  100),  // Sector start angle 0
-    new SvgArcData(null, 0, 0,      PI / 3, 50, 100),  // Slice start angle 0
-    new SvgArcData(null, 0, PI / 3, PI,     0,  100),  // Sector start angle > 0
-    new SvgArcData(null, 0, PI / 3, PI,     50, 100),  // Slice start angle > 0
+    new SvgArcData(null, 0, 0,      2 * pi, 0,  100),  // Whole sector
+    new SvgArcData(null, 0, 0,      2 * pi, 50, 100),  // Whole donut
+    new SvgArcData(null, 0, 0,      pi / 3, 0,  100),  // Sector start angle 0
+    new SvgArcData(null, 0, 0,      pi / 3, 50, 100),  // Slice start angle 0
+    new SvgArcData(null, 0, pi / 3, pi,     0,  100),  // Sector start angle > 0
+    new SvgArcData(null, 0, pi / 3, pi,     50, 100),  // Slice start angle > 0
   ];
 
   test('interpolateSvgArcData() returns an InterpolateFn that '
diff --git a/packages/quiver/lib/io.dart b/packages/quiver/lib/io.dart
index 1e1bbc6..0332b16 100644
--- a/packages/quiver/lib/io.dart
+++ b/packages/quiver/lib/io.dart
@@ -20,7 +20,7 @@
 
 ///  Converts a [Stream] of byte lists to a [String].
 Future<String> byteStreamToString(Stream<List<int>> stream,
-    {Encoding encoding: UTF8}) {
+    {Encoding encoding: utf8}) {
   return stream.transform(encoding.decoder).join();
 }
 
@@ -47,7 +47,7 @@
           if (entity is! File && recurse == true) {
             if (entity is Link) {
               if (FileSystemEntity.typeSync(entity.path, followLinks: true) ==
-                  FileSystemEntityType.DIRECTORY) {
+                  FileSystemEntityType.directory) {
                 var fullPath = getFullPath(entity.path).toString();
                 var dirFullPath = getFullPath(dir.path).toString();
                 if (!dirFullPath.startsWith(fullPath)) {
diff --git a/packages/quiver/lib/src/time/util.dart b/packages/quiver/lib/src/time/util.dart
index 332db12..b792803 100644
--- a/packages/quiver/lib/src/time/util.dart
+++ b/packages/quiver/lib/src/time/util.dart
@@ -23,7 +23,7 @@
 /// This function assumes the use of the Gregorian calendar or the proleptic
 /// Gregorian calendar.
 int daysInMonth(int year, int month) =>
-    (month == DateTime.FEBRUARY && isLeapYear(year)) ? 29 : _daysInMonth[month];
+    (month == DateTime.february && isLeapYear(year)) ? 29 : _daysInMonth[month];
 
 /// Returns true if [year] is a leap year.
 ///
diff --git a/packages/quiver/lib/testing/src/async/fake_async.dart b/packages/quiver/lib/testing/src/async/fake_async.dart
index c25aad8..3767d50 100644
--- a/packages/quiver/lib/testing/src/async/fake_async.dart
+++ b/packages/quiver/lib/testing/src/async/fake_async.dart
@@ -118,7 +118,7 @@
 }
 
 class _FakeAsync implements FakeAsync {
-  Duration _elapsed = Duration.ZERO;
+  Duration _elapsed = Duration.zero;
   Duration _elapsingTo;
   Queue<Function> _microtasks = new Queue();
   Set<_FakeTimer> _timers = new Set<_FakeTimer>();
@@ -275,7 +275,7 @@
   //     http://www.w3.org/TR/html5/webappapis.html#timer-nesting-level
   // Without some sort of delay this can lead to infinitely looping timers.
   // What do the dart VM and dart2js timers do here?
-  static const _minDuration = Duration.ZERO;
+  static const _minDuration = Duration.zero;
 
   _FakeTimer._(Duration duration, this._callback, this._isPeriodic, this._time)
       : _duration = duration < _minDuration ? _minDuration : duration {
diff --git a/packages/quiver/test/io_test.dart b/packages/quiver/test/io_test.dart
index 9f33565..8b1afc0 100644
--- a/packages/quiver/test/io_test.dart
+++ b/packages/quiver/test/io_test.dart
@@ -26,7 +26,7 @@
   group('byteStreamToString', () {
     test('should decode UTF8 text by default', () {
       var string = '箙、靫';
-      var encoded = UTF8.encoder.convert(string);
+      var encoded = utf8.encoder.convert(string);
       var data = [encoded.sublist(0, 3), encoded.sublist(3)];
       var stream = new Stream<List<int>>.fromIterable(data);
       byteStreamToString(stream).then((decoded) {
@@ -36,10 +36,10 @@
 
     test('should decode text with the specified encoding', () {
       var string = 'blåbærgrød';
-      var encoded = LATIN1.encoder.convert(string);
+      var encoded = latin1.encoder.convert(string);
       var data = [encoded.sublist(0, 4), encoded.sublist(4)];
       var stream = new Stream<List<int>>.fromIterable(data);
-      byteStreamToString(stream, encoding: LATIN1).then((decoded) {
+      byteStreamToString(stream, encoding: latin1).then((decoded) {
         expect(decoded, string);
       });
     });
diff --git a/packages/quiver/test/testing/async/fake_async_test.dart b/packages/quiver/test/testing/async/fake_async_test.dart
index 7e90b02..9b97ede 100644
--- a/packages/quiver/test/testing/async/fake_async_test.dart
+++ b/packages/quiver/test/testing/async/fake_async_test.dart
@@ -273,7 +273,7 @@
 
         test('should not be additive with elapseBlocking', () {
           new FakeAsync().run((async) {
-            new Timer(Duration.ZERO, () => async.elapseBlocking(elapseBy * 5));
+            new Timer(Duration.zero, () => async.elapseBlocking(elapseBy * 5));
             async.elapse(elapseBy);
             expect(async.getClock(initialTime).now(),
                 initialTime.add(elapseBy * 5));
@@ -310,7 +310,7 @@
           new FakeAsync().run((async) {
             var callCount = 0;
             new Future(() => callCount++);
-            async.elapse(Duration.ZERO);
+            async.elapse(Duration.zero);
             expect(callCount, 1);
           });
         });
diff --git a/packages/unittest/CHANGELOG.md b/packages/unittest/CHANGELOG.md
index b60e66b..030ba7a 100644
--- a/packages/unittest/CHANGELOG.md
+++ b/packages/unittest/CHANGELOG.md
@@ -1,3 +1,9 @@
+##0.11.8
+
+* Make this branch Dart 2 compatible by using new constant names.
+  The code is no longer Dart 1 compatible, so this version should only be used
+  to run tests that have not yet been converted to using the `test` package.
+
 ##0.11.7
 
 * Add separate methods for `expectAysnc` based on number of callback arguments 
diff --git a/packages/unittest/lib/html_config.dart b/packages/unittest/lib/html_config.dart
index dc866a0..da88f88 100644
--- a/packages/unittest/lib/html_config.dart
+++ b/packages/unittest/lib/html_config.dart
@@ -84,13 +84,13 @@
               ${testCase.description}
             </a>.
           </p>
-          <pre>${HTML_ESCAPE.convert(testCase.message)}</pre>
+          <pre>${htmlEscape.convert(testCase.message)}</pre>
         </td>
       </tr>''';
 
   if (testCase.stackTrace != null) {
     html = '$html<tr><td></td><td colspan="2"><pre>' +
-        HTML_ESCAPE.convert(testCase.stackTrace.toString()) +
+        htmlEscape.convert(testCase.stackTrace.toString()) +
         '</pre></td></tr>';
   }
 
diff --git a/packages/unittest/lib/html_enhanced_config.dart b/packages/unittest/lib/html_enhanced_config.dart
index 0178ccb..7c0ab5e 100644
--- a/packages/unittest/lib/html_enhanced_config.dart
+++ b/packages/unittest/lib/html_enhanced_config.dart
@@ -248,11 +248,11 @@
     }
 
     addRowElement('${test_.id}', '${test_.result.toUpperCase()}',
-        '${test_.description}. ${HTML_ESCAPE.convert(test_.message)}');
+        '${test_.description}. ${htmlEscape.convert(test_.message)}');
 
     if (test_.stackTrace != null) {
       addRowElement('', '',
-          '<pre>${HTML_ESCAPE.convert(test_.stackTrace.toString())}</pre>');
+          '<pre>${htmlEscape.convert(test_.stackTrace.toString())}</pre>');
     }
   }
 
diff --git a/packages/unittest/lib/src/matcher/core_matchers.dart b/packages/unittest/lib/src/matcher/core_matchers.dart
index dbba367..e400e2b 100644
--- a/packages/unittest/lib/src/matcher/core_matchers.dart
+++ b/packages/unittest/lib/src/matcher/core_matchers.dart
@@ -74,13 +74,13 @@
 
 class _IsNaN extends Matcher {
   const _IsNaN();
-  bool matches(item, Map matchState) => double.NAN.compareTo(item) == 0;
+  bool matches(item, Map matchState) => double.nan.compareTo(item) == 0;
   Description describe(Description description) => description.add('NaN');
 }
 
 class _IsNotNaN extends Matcher {
   const _IsNotNaN();
-  bool matches(item, Map matchState) => double.NAN.compareTo(item) != 0;
+  bool matches(item, Map matchState) => double.nan.compareTo(item) != 0;
   Description describe(Description description) => description.add('not NaN');
 }
 
diff --git a/packages/unittest/lib/vm_config.dart b/packages/unittest/lib/vm_config.dart
index de214f3..ac64938 100644
--- a/packages/unittest/lib/vm_config.dart
+++ b/packages/unittest/lib/vm_config.dart
@@ -20,7 +20,7 @@
   bool useColor;
 
   VMConfiguration()
-      : useColor = stdioType(stdout) == StdioType.TERMINAL,
+      : useColor = stdioType(stdout) == StdioType.terminal,
         super();
 
   String formatResult(TestCase testCase) {
diff --git a/packages/unittest/pubspec.yaml b/packages/unittest/pubspec.yaml
index bc94363..89d2d16 100644
--- a/packages/unittest/pubspec.yaml
+++ b/packages/unittest/pubspec.yaml
@@ -1,10 +1,10 @@
 name: unittest
-version: 0.11.7
+version: 0.11.8
 author: Dart Team <misc@dartlang.org>
 description: A library for writing dart unit tests.
 homepage: https://github.com/dart-lang/old_unittest
 environment:
-  sdk: '>=1.0.0 <2.0.0'
+  sdk: '>=2.0.0-dev.61.0 <3.0.0'
 dependencies:
   stack_trace: '>=0.9.0 <2.0.0'
 dev_dependencies:
diff --git a/packages/unittest/test/core_matchers_test.dart b/packages/unittest/test/core_matchers_test.dart
index 3e16882..1a88da7 100644
--- a/packages/unittest/test/core_matchers_test.dart
+++ b/packages/unittest/test/core_matchers_test.dart
@@ -33,13 +33,13 @@
   });
 
   test('isNaN', () {
-    shouldPass(double.NAN, isNaN);
+    shouldPass(double.nan, isNaN);
     shouldFail(3.1, isNaN, "Expected: NaN Actual: <3.1>");
   });
 
   test('isNotNaN', () {
     shouldPass(3.1, isNotNaN);
-    shouldFail(double.NAN, isNotNaN, "Expected: not NaN Actual: <NaN>");
+    shouldFail(double.nan, isNotNaN, "Expected: not NaN Actual: <NaN>");
   });
 
   test('same', () {
