diff --git a/.gitignore b/.gitignore
index b30294d..2afa93d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,4 @@
-.children
-.project
-.DS_Store
-packages
+.dart_tool
+.packages
+.pub
 pubspec.lock
-*.sublime-workspace
-*.sublime-project
diff --git a/changelog.md b/changelog.md
new file mode 100644
index 0000000..75f765c
--- /dev/null
+++ b/changelog.md
@@ -0,0 +1,3 @@
+### 1.0.5
+
+* Updates to support Dart 2.
diff --git a/example/DeltaBlue.dart b/example/DeltaBlue.dart
index 152a3dd..f234f74 100644
--- a/example/DeltaBlue.dart
+++ b/example/DeltaBlue.dart
@@ -40,10 +40,8 @@
   new DeltaBlue().report();
 }
 
-
 /// Benchmark class required to report results.
 class DeltaBlue extends BenchmarkBase {
-
   const DeltaBlue() : super("DeltaBlue");
 
   void run() {
@@ -52,7 +50,6 @@
   }
 }
 
-
 /**
  * Strengths are used to measure the relative importance of constraints.
  * New strengths may be inserted in the strength hierarchy without
@@ -60,15 +57,19 @@
  * this class, so == can be used for value comparison.
  */
 class Strength {
-
   final int value;
   final String name;
 
   const Strength(this.value, this.name);
 
-  Strength nextWeaker() =>
-     const <Strength>[WEAKEST, WEAK_DEFAULT, NORMAL, STRONG_DEFAULT,
-                      PREFERRED, STRONG_REFERRED][value];
+  Strength nextWeaker() => const <Strength>[
+        WEAKEST,
+        WEAK_DEFAULT,
+        NORMAL,
+        STRONG_DEFAULT,
+        PREFERRED,
+        STRONG_REFERRED
+      ][value];
 
   static bool stronger(Strength s1, Strength s2) {
     return s1.value < s2.value;
@@ -87,19 +88,16 @@
   }
 }
 
-
 // Compile time computed constants.
-const REQUIRED        = const Strength(0, "required");
+const REQUIRED = const Strength(0, "required");
 const STRONG_REFERRED = const Strength(1, "strongPreferred");
-const PREFERRED       = const Strength(2, "preferred");
-const STRONG_DEFAULT  = const Strength(3, "strongDefault");
-const NORMAL          = const Strength(4, "normal");
-const WEAK_DEFAULT    = const Strength(5, "weakDefault");
-const WEAKEST         = const Strength(6, "weakest");
-
+const PREFERRED = const Strength(2, "preferred");
+const STRONG_DEFAULT = const Strength(3, "strongDefault");
+const NORMAL = const Strength(4, "normal");
+const WEAK_DEFAULT = const Strength(5, "weakDefault");
+const WEAKEST = const Strength(6, "weakest");
 
 abstract class Constraint {
-
   final Strength strength;
 
   const Constraint(this.strength);
@@ -163,7 +161,6 @@
  * Abstract superclass for constraints having a single possible output variable.
  */
 abstract class UnaryConstraint extends Constraint {
-
   final Variable myOutput;
   bool satisfied = false;
 
@@ -179,8 +176,8 @@
 
   /// Decides if this constraint can be satisfied and records that decision.
   void chooseMethod(int mark) {
-    satisfied = (myOutput.mark != mark)
-      && Strength.stronger(strength, myOutput.walkStrength);
+    satisfied = (myOutput.mark != mark) &&
+        Strength.stronger(strength, myOutput.walkStrength);
   }
 
   /// Returns true if this constraint is satisfied in the current solution.
@@ -217,7 +214,6 @@
   }
 }
 
-
 /**
  * Variables that should, with some level of preference, stay the same.
  * Planners may exploit the fact that instances, if satisfied, will not
@@ -225,7 +221,6 @@
  * optimization".
  */
 class StayConstraint extends UnaryConstraint {
-
   StayConstraint(Variable v, Strength str) : super(v, str);
 
   void execute() {
@@ -233,13 +228,11 @@
   }
 }
 
-
 /**
  * A unary input constraint used to mark a variable that the client
  * wishes to change.
  */
 class EditConstraint extends UnaryConstraint {
-
   EditConstraint(Variable v, Strength str) : super(v, str);
 
   /// Edits indicate that a variable is to be changed by imperative code.
@@ -250,19 +243,16 @@
   }
 }
 
-
 // Directions.
 const int NONE = 1;
 const int FORWARD = 2;
 const int BACKWARD = 0;
 
-
 /**
  * Abstract superclass for constraints having two possible output
  * variables.
  */
 abstract class BinaryConstraint extends Constraint {
-
   Variable v1;
   Variable v2;
   int direction = NONE;
@@ -278,21 +268,23 @@
    */
   void chooseMethod(int mark) {
     if (v1.mark == mark) {
-      direction = (v2.mark != mark &&
-                   Strength.stronger(strength, v2.walkStrength))
-        ? FORWARD : NONE;
+      direction =
+          (v2.mark != mark && Strength.stronger(strength, v2.walkStrength))
+              ? FORWARD
+              : NONE;
     }
     if (v2.mark == mark) {
-      direction = (v1.mark != mark &&
-                   Strength.stronger(strength, v1.walkStrength))
-        ? BACKWARD : NONE;
+      direction =
+          (v1.mark != mark && Strength.stronger(strength, v1.walkStrength))
+              ? BACKWARD
+              : NONE;
     }
     if (Strength.weaker(v1.walkStrength, v2.walkStrength)) {
-      direction = Strength.stronger(strength, v1.walkStrength)
-        ? BACKWARD : NONE;
+      direction =
+          Strength.stronger(strength, v1.walkStrength) ? BACKWARD : NONE;
     } else {
-      direction = Strength.stronger(strength, v2.walkStrength)
-        ? FORWARD : BACKWARD;
+      direction =
+          Strength.stronger(strength, v2.walkStrength) ? FORWARD : BACKWARD;
     }
   }
 
@@ -346,7 +338,6 @@
   }
 }
 
-
 /**
  * Relates two variables by the linear scaling relationship: "v2 =
  * (v1 * scale) + offset". Either v1 or v2 may be changed to maintain
@@ -355,13 +346,12 @@
  */
 
 class ScaleConstraint extends BinaryConstraint {
-
   final Variable scale;
   final Variable offset;
 
-  ScaleConstraint(Variable src, this.scale, this.offset,
-                  Variable dest, Strength strength)
-    : super(src, dest, strength);
+  ScaleConstraint(
+      Variable src, this.scale, this.offset, Variable dest, Strength strength)
+      : super(src, dest, strength);
 
   /// Adds this constraint to the constraint graph.
   void addToGraph() {
@@ -401,17 +391,14 @@
     out.stay = ihn.stay && scale.stay && offset.stay;
     if (out.stay) execute();
   }
-
 }
 
-
 /**
  * Constrains two variables to have the same value.
  */
 class EqualityConstraint extends BinaryConstraint {
-
   EqualityConstraint(Variable v1, Variable v2, Strength strength)
-    : super(v1, v2, strength);
+      : super(v1, v2, strength);
 
   /// Enforce this constraint. Assume that it is satisfied.
   void execute() {
@@ -419,7 +406,6 @@
   }
 }
 
-
 /**
  * A constrained variable. In addition to its value, it maintain the
  * structure of the constraint graph, the current dataflow graph, and
@@ -427,7 +413,6 @@
  * constraint solver.
  **/
 class Variable {
-
   List<Constraint> constraints = <Constraint>[];
   Constraint determinedBy;
   int mark = 0;
@@ -453,9 +438,7 @@
   }
 }
 
-
 class Planner {
-
   int currentMark = 0;
 
   /**
@@ -474,7 +457,7 @@
    */
   void incrementalAdd(Constraint c) {
     int mark = newMark();
-    for(Constraint overridden = c.satisfy(mark);
+    for (Constraint overridden = c.satisfy(mark);
         overridden != null;
         overridden = overridden.satisfy(mark));
   }
@@ -621,7 +604,6 @@
   }
 }
 
-
 /**
  * A Plan is an ordered list of constraints to be executed in sequence
  * to resatisfy all currently satisfiable constraints in the face of
@@ -643,7 +625,6 @@
   }
 }
 
-
 /**
  * This is the standard DeltaBlue benchmark. A long chain of equality
  * constraints is constructed with a stay constraint on one end. An
diff --git a/example/FluidMotion/dart/FluidMotion.dart b/example/FluidMotion/dart/FluidMotion.dart
index b4e887b..69e3ccb 100644
--- a/example/FluidMotion/dart/FluidMotion.dart
+++ b/example/FluidMotion/dart/FluidMotion.dart
@@ -47,7 +47,7 @@
     framesTillAddingPoints = 0;
     framesBetweenAddingPoints = 5;
     solver = new FluidField.create(null, 128, 128, 20);
-    solver.setDisplayFunction((a){});
+    solver.setDisplayFunction((a) {});
     solver.setUICallback(prepareFrame);
   }
 
@@ -96,7 +96,6 @@
   }
 }
 
-
 // Code from Oliver Hunt (http://nerget.com/fluidSim/pressure.js) starts here.
 
 class FluidField {
@@ -114,7 +113,7 @@
   static FluidField _lastCreated;
 
   static bool approxEquals(double a, double b) => (a - b).abs() < 0.000001;
-  
+
   validate(expectedDens, expectedU, expectedV) {
     var sumDens = 0.0;
     var sumU = 0.0;
@@ -124,14 +123,13 @@
       sumU += u[i];
       sumV += v[i];
     }
-    
+
     if (!approxEquals(sumDens, expectedDens) ||
         !approxEquals(sumU, expectedU) ||
         !approxEquals(sumV, expectedV)) {
       throw "Incorrect result";
     }
   }
-  
 
   // Allocates a new FluidField or return previously allocated field if the
   // size is too large.
@@ -143,16 +141,15 @@
       _lastCreated = new FluidField(canvas, 64, 64, iterations);
     }
     assert((canvas == _lastCreated.canvas) &&
-           (iterations == _lastCreated.iterations));
+        (iterations == _lastCreated.iterations));
     return _lastCreated;
   }
 
-
-  FluidField(this.canvas, int hRes, int wRes, this.iterations) :
-      width = wRes,
-      height = hRes,
-      rowSize = (wRes + 2),
-      size = (wRes + 2) * (hRes + 2) {
+  FluidField(this.canvas, int hRes, int wRes, this.iterations)
+      : width = wRes,
+        height = hRes,
+        rowSize = (wRes + 2),
+        size = (wRes + 2) * (hRes + 2) {
     reset();
   }
 
@@ -167,15 +164,15 @@
   }
 
   void addFields(Float64List x, Float64List s, double dt) {
-    for (var i=0; i< size ; i++) x[i] += dt*s[i];
+    for (var i = 0; i < size; i++) x[i] += dt * s[i];
   }
 
   void set_bnd(int b, Float64List x) {
-    if (b==1) {
+    if (b == 1) {
       var i = 1;
       for (; i <= width; i++) {
-        x[i] =  x[i + rowSize];
-        x[i + (height+1) *rowSize] = x[i + height * rowSize];
+        x[i] = x[i + rowSize];
+        x[i + (height + 1) * rowSize] = x[i + height * rowSize];
       }
 
       for (var j = 1; j <= height; j++) {
@@ -189,31 +186,31 @@
       }
 
       for (var j = 1; j <= height; j++) {
-        x[j * rowSize] =  x[1 + j * rowSize];
-        x[(width + 1) + j * rowSize] =  x[width + j * rowSize];
+        x[j * rowSize] = x[1 + j * rowSize];
+        x[(width + 1) + j * rowSize] = x[width + j * rowSize];
       }
     } else {
       for (var i = 1; i <= width; i++) {
-        x[i] =  x[i + rowSize];
+        x[i] = x[i + rowSize];
         x[i + (height + 1) * rowSize] = x[i + height * rowSize];
       }
 
       for (var j = 1; j <= height; j++) {
-        x[j * rowSize] =  x[1 + j * rowSize];
-        x[(width + 1) + j * rowSize] =  x[width + j * rowSize];
+        x[j * rowSize] = x[1 + j * rowSize];
+        x[(width + 1) + j * rowSize] = x[width + j * rowSize];
       }
     }
     var maxEdge = (height + 1) * rowSize;
-    x[0]                 = 0.5 * (x[1] + x[rowSize]);
-    x[maxEdge]           = 0.5 * (x[1 + maxEdge] + x[height * rowSize]);
-    x[(width+1)]         = 0.5 * (x[width] + x[(width + 1) + rowSize]);
-    x[(width+1)+maxEdge] = 0.5 * (x[width + maxEdge] + x[(width + 1) +
-        height * rowSize]);
+    x[0] = 0.5 * (x[1] + x[rowSize]);
+    x[maxEdge] = 0.5 * (x[1 + maxEdge] + x[height * rowSize]);
+    x[(width + 1)] = 0.5 * (x[width] + x[(width + 1) + rowSize]);
+    x[(width + 1) + maxEdge] =
+        0.5 * (x[width + maxEdge] + x[(width + 1) + height * rowSize]);
   }
 
   void lin_solve(int b, Float64List x, Float64List x0, int a, int c) {
     if (a == 0 && c == 1) {
-      for (var j=1 ; j<=height; j++) {
+      for (var j = 1; j <= height; j++) {
         var currentRow = j * rowSize;
         ++currentRow;
         for (var i = 0; i < width; i++) {
@@ -224,16 +221,21 @@
       set_bnd(b, x);
     } else {
       var invC = 1 / c;
-      for (var k=0 ; k<iterations; k++) {
-        for (var j=1 ; j<=height; j++) {
+      for (var k = 0; k < iterations; k++) {
+        for (var j = 1; j <= height; j++) {
           var lastRow = (j - 1) * rowSize;
           var currentRow = j * rowSize;
           var nextRow = (j + 1) * rowSize;
           var lastX = x[currentRow];
           ++currentRow;
-          for (var i=1; i<=width; i++)
+          for (var i = 1; i <= width; i++)
             lastX = x[currentRow] = (x0[currentRow] +
-                a*(lastX+x[++currentRow]+x[++lastRow]+x[++nextRow])) * invC;
+                    a *
+                        (lastX +
+                            x[++currentRow] +
+                            x[++lastRow] +
+                            x[++nextRow])) *
+                invC;
         }
         set_bnd(b, x);
       }
@@ -242,13 +244,13 @@
 
   void diffuse(int b, Float64List x, Float64List x0, double dt) {
     var a = 0;
-    lin_solve(b, x, x0, a, 1 + 4*a);
+    lin_solve(b, x, x0, a, 1 + 4 * a);
   }
 
-  void lin_solve2(Float64List x, Float64List x0,
-                  Float64List y, Float64List y0, int a, int c) {
+  void lin_solve2(Float64List x, Float64List x0, Float64List y, Float64List y0,
+      int a, int c) {
     if (a == 0 && c == 1) {
-      for (var j=1 ; j <= height; j++) {
+      for (var j = 1; j <= height; j++) {
         var currentRow = j * rowSize;
         ++currentRow;
         for (var i = 0; i < width; i++) {
@@ -260,9 +262,9 @@
       set_bnd(1, x);
       set_bnd(2, y);
     } else {
-      var invC = 1/c;
-      for (var k=0 ; k<iterations; k++) {
-        for (var j=1 ; j <= height; j++) {
+      var invC = 1 / c;
+      for (var k = 0; k < iterations; k++) {
+        for (var j = 1; j <= height; j++) {
           var lastRow = (j - 1) * rowSize;
           var currentRow = j * rowSize;
           var nextRow = (j + 1) * rowSize;
@@ -270,10 +272,16 @@
           var lastY = y[currentRow];
           ++currentRow;
           for (var i = 1; i <= width; i++) {
-            lastX = x[currentRow] = (x0[currentRow] + a *
-                (lastX + x[currentRow] + x[lastRow] + x[nextRow])) * invC;
-            lastY = y[currentRow] = (y0[currentRow] + a *
-                (lastY + y[++currentRow] + y[++lastRow] + y[++nextRow])) * invC;
+            lastX = x[currentRow] = (x0[currentRow] +
+                    a * (lastX + x[currentRow] + x[lastRow] + x[nextRow])) *
+                invC;
+            lastY = y[currentRow] = (y0[currentRow] +
+                    a *
+                        (lastY +
+                            y[++currentRow] +
+                            y[++lastRow] +
+                            y[++nextRow])) *
+                invC;
           }
         }
         set_bnd(1, x);
@@ -282,33 +290,30 @@
     }
   }
 
-  void diffuse2(Float64List x, Float64List x0, y,
-                Float64List y0, double dt) {
+  void diffuse2(Float64List x, Float64List x0, y, Float64List y0, double dt) {
     var a = 0;
     lin_solve2(x, x0, y, y0, a, 1 + 4 * a);
   }
 
-  void advect(int b, Float64List d, Float64List d0,
-              Float64List u, Float64List v, double dt) {
+  void advect(int b, Float64List d, Float64List d0, Float64List u,
+      Float64List v, double dt) {
     var Wdt0 = dt * width;
     var Hdt0 = dt * height;
     var Wp5 = width + 0.5;
     var Hp5 = height + 0.5;
-    for (var j = 1; j<= height; j++) {
+    for (var j = 1; j <= height; j++) {
       var pos = j * rowSize;
       for (var i = 1; i <= width; i++) {
         var x = i - Wdt0 * u[++pos];
         var y = j - Hdt0 * v[pos];
         if (x < 0.5)
           x = 0.5;
-        else if (x > Wp5)
-          x = Wp5;
+        else if (x > Wp5) x = Wp5;
         var i0 = x.toInt();
         var i1 = i0 + 1;
         if (y < 0.5)
           y = 0.5;
-        else if (y > Hp5)
-          y = Hp5;
+        else if (y > Hp5) y = Hp5;
         var j0 = y.toInt();
         var j1 = j0 + 1;
         var s1 = x - i0;
@@ -324,70 +329,75 @@
     set_bnd(b, d);
   }
 
-  void project(Float64List u, Float64List v,
-               Float64List p, Float64List div) {
+  void project(Float64List u, Float64List v, Float64List p, Float64List div) {
     var h = -0.5 / sqrt(width * height);
-    for (var j = 1 ; j <= height; j++ ) {
+    for (var j = 1; j <= height; j++) {
       var row = j * rowSize;
       var previousRow = (j - 1) * rowSize;
       var prevValue = row - 1;
       var currentRow = row;
       var nextValue = row + 1;
       var nextRow = (j + 1) * rowSize;
-      for (var i = 1; i <= width; i++ ) {
-        div[++currentRow] = h * (u[++nextValue] - u[++prevValue] +
-            v[++nextRow] - v[++previousRow]);
+      for (var i = 1; i <= width; i++) {
+        div[++currentRow] = h *
+            (u[++nextValue] - u[++prevValue] + v[++nextRow] - v[++previousRow]);
         p[currentRow] = 0.0;
       }
     }
     set_bnd(0, div);
     set_bnd(0, p);
 
-    lin_solve(0, p, div, 1, 4 );
+    lin_solve(0, p, div, 1, 4);
     var wScale = 0.5 * width;
     var hScale = 0.5 * height;
-    for (var j = 1; j<= height; j++ ) {
+    for (var j = 1; j <= height; j++) {
       var prevPos = j * rowSize - 1;
       var currentPos = j * rowSize;
       var nextPos = j * rowSize + 1;
       var prevRow = (j - 1) * rowSize;
-      var currentRow = j * rowSize;
       var nextRow = (j + 1) * rowSize;
 
-      for (var i = 1; i<= width; i++) {
+      for (var i = 1; i <= width; i++) {
         u[++currentPos] -= wScale * (p[++nextPos] - p[++prevPos]);
-        v[currentPos]   -= hScale * (p[++nextRow] - p[++prevRow]);
+        v[currentPos] -= hScale * (p[++nextRow] - p[++prevRow]);
       }
     }
     set_bnd(1, u);
     set_bnd(2, v);
   }
 
-  void dens_step(Float64List x, Float64List x0,
-                 Float64List u, Float64List v, double dt) {
+  void dens_step(
+      Float64List x, Float64List x0, Float64List u, Float64List v, double dt) {
     addFields(x, x0, dt);
-    diffuse(0, x0, x, dt );
-    advect(0, x, x0, u, v, dt );
+    diffuse(0, x0, x, dt);
+    advect(0, x, x0, u, v, dt);
   }
 
-  void vel_step(Float64List u, Float64List v,
-                Float64List u0, Float64List v0, double dt) {
-    addFields(u, u0, dt );
-    addFields(v, v0, dt );
-    var temp = u0; u0 = u; u = temp;
-    temp = v0; v0 = v; v = temp;
-    diffuse2(u,u0,v,v0, dt);
+  void vel_step(
+      Float64List u, Float64List v, Float64List u0, Float64List v0, double dt) {
+    addFields(u, u0, dt);
+    addFields(v, v0, dt);
+    var temp = u0;
+    u0 = u;
+    u = temp;
+    temp = v0;
+    v0 = v;
+    v = temp;
+    diffuse2(u, u0, v, v0, dt);
     project(u, v, u0, v0);
-    temp = u0; u0 = u; u = temp;
-    temp = v0; v0 = v; v = temp;
+    temp = u0;
+    u0 = u;
+    u = temp;
+    temp = v0;
+    v0 = v;
+    v = temp;
     advect(1, u, u0, u0, v0, dt);
     advect(2, v, v0, u0, v0, dt);
-    project(u, v, u0, v0 );
+    project(u, v, u0, v0);
   }
 
   var uiCallback;
 
-
   void setDisplayFunction(func) {
     displayFunc = func;
   }
@@ -424,7 +434,7 @@
   }
 
   double getDensity(int x, int y) {
-    return dens[(x + 1) + (y + 1) * rowSize];  // rowSize from FluidField?
+    return dens[(x + 1) + (y + 1) * rowSize]; // rowSize from FluidField?
   }
 
   void setVelocity(int x, int y, double xv, double yv) {
diff --git a/example/Richards.dart b/example/Richards.dart
index 89af958..0659bac 100644
--- a/example/Richards.dart
+++ b/example/Richards.dart
@@ -36,17 +36,14 @@
 
 import 'package:benchmark_harness/benchmark_harness.dart';
 
-
 main() {
   new Richards().report();
 }
 
-
 /**
  * Richards imulates the task dispatcher of an operating system.
  **/
 class Richards extends BenchmarkBase {
-
   const Richards() : super("Richards");
 
   void run() {
@@ -76,7 +73,7 @@
     if (scheduler.queueCount != EXPECTED_QUEUE_COUNT ||
         scheduler.holdCount != EXPECTED_HOLD_COUNT) {
       print("Error during execution: queueCount = ${scheduler.queueCount}"
-            ", holdCount = ${scheduler.holdCount}.");
+          ", holdCount = ${scheduler.holdCount}.");
     }
     if (EXPECTED_QUEUE_COUNT != scheduler.queueCount) {
       throw "bad scheduler queue-count";
@@ -111,21 +108,19 @@
   static const int KIND_WORK = 1;
 }
 
-
 /**
  * A scheduler can be used to schedule a set of tasks based on their relative
  * priorities.  Scheduling is done by maintaining a list of task control blocks
  * which holds tasks and the data queue they are processing.
  */
 class Scheduler {
-
   int queueCount = 0;
   int holdCount = 0;
   TaskControlBlock currentTcb;
   int currentId;
   TaskControlBlock list;
   List<TaskControlBlock> blocks =
-    new List<TaskControlBlock>(Richards.NUMBER_OF_IDS);
+      new List<TaskControlBlock>(Richards.NUMBER_OF_IDS);
 
   /// Add an idle task to this scheduler.
   void addIdleTask(int id, int priority, Packet queue, int count) {
@@ -134,10 +129,8 @@
 
   /// Add a work task to this scheduler.
   void addWorkerTask(int id, int priority, Packet queue) {
-    addTask(id,
-            priority,
-            queue,
-            new WorkerTask(this, Richards.ID_HANDLER_A, 0));
+    addTask(
+        id, priority, queue, new WorkerTask(this, Richards.ID_HANDLER_A, 0));
   }
 
   /// Add a handler task to this scheduler.
@@ -221,15 +214,13 @@
   }
 }
 
-
 /**
  * A task control block manages a task and the queue of work packages associated
  * with it.
  */
 class TaskControlBlock {
-
   TaskControlBlock link;
-  int id;       // The id of this block.
+  int id; // The id of this block.
   int priority; // The priority of this block.
   Packet queue; // The queue of packages to be processed by the task.
   Task task;
@@ -270,8 +261,7 @@
   }
 
   bool isHeldOrSuspended() {
-    return (state & STATE_HELD) != 0 ||
-           (state == STATE_SUSPENDED);
+    return (state & STATE_HELD) != 0 || (state == STATE_SUSPENDED);
   }
 
   void markAsSuspended() {
@@ -318,7 +308,6 @@
  *  Abstract task that manipulates work packets.
  */
 abstract class Task {
-
   Scheduler scheduler; // The scheduler that manages this task.
 
   Task(this.scheduler);
@@ -331,8 +320,7 @@
  * device tasks.
  */
 class IdleTask extends Task {
-
-  int v1;    // A seed value that controls how the device tasks are scheduled.
+  int v1; // A seed value that controls how the device tasks are scheduled.
   int count; // The number of times this task should be scheduled.
 
   IdleTask(Scheduler scheduler, this.v1, this.count) : super(scheduler);
@@ -351,13 +339,11 @@
   String toString() => "IdleTask";
 }
 
-
 /**
  * A task that suspends itself after each time it has been run to simulate
  * waiting for data from an external device.
  */
 class DeviceTask extends Task {
-
   Packet v1;
 
   DeviceTask(Scheduler scheduler) : super(scheduler);
@@ -376,12 +362,10 @@
   String toString() => "DeviceTask";
 }
 
-
 /**
  * A task that manipulates work packets.
  */
 class WorkerTask extends Task {
-
   int v1; // A seed used to specify how work packets are manipulated.
   int v2; // Another seed used to specify how work packets are manipulated.
 
@@ -409,12 +393,10 @@
   String toString() => "WorkerTask";
 }
 
-
 /**
  * A task that manipulates work packets and then suspends itself.
  */
 class HandlerTask extends Task {
-
   Packet v1;
   Packet v2;
 
@@ -451,7 +433,6 @@
   String toString() => "HandlerTask";
 }
 
-
 /**
  * A simple package of data that is manipulated by the tasks.  The exact layout
  * of the payload data carried by a packet is not importaint, and neither is the
@@ -460,10 +441,9 @@
  * data and worklists.
  */
 class Packet {
-
   Packet link; // The tail of the linked list of packets.
-  int id;      // An ID for this packet.
-  int kind;    // The type of this packet.
+  int id; // An ID for this packet.
+  int kind; // The type of this packet.
   int a1 = 0;
 
   List<int> a2 = new List(Richards.DATA_SIZE);
diff --git a/example/Template.dart b/example/Template.dart
index f6a62f1..b930809 100644
--- a/example/Template.dart
+++ b/example/Template.dart
@@ -12,14 +12,13 @@
   }
 
   // The benchmark code.
-  void run() {
-  }
+  void run() {}
 
   // Not measured setup code executed prior to the benchmark runs.
-  void setup() { }
+  void setup() {}
 
   // Not measures teardown code executed after the benchark runs.
-  void teardown() { }
+  void teardown() {}
 }
 
 main() {
diff --git a/example/Tracer/dart/Tracer.dart b/example/Tracer/dart/Tracer.dart
index 7a4f5f3..4c7bd14 100644
--- a/example/Tracer/dart/Tracer.dart
+++ b/example/Tracer/dart/Tracer.dart
@@ -7,6 +7,7 @@
 
 library ray_trace;
 
+import 'dart:html';
 import 'dart:math';
 
 import 'package:benchmark_harness/benchmark_harness.dart';
diff --git a/example/Tracer/dart/app.dart b/example/Tracer/dart/app.dart
index f07f077..28c9cb5 100644
--- a/example/Tracer/dart/app.dart
+++ b/example/Tracer/dart/app.dart
@@ -15,15 +15,17 @@
 var checkNumber;
 
 main() {
-  var button = query('#render');
-  var canvas = query('#canvas');
-  var time = query('#time');
+  var button = querySelector('#render');
+  var canvas = querySelector('#canvas') as CanvasElement;
+  var time = querySelector('#time');
   button.onClick.listen((e) {
-    canvas.width = int.parse(query('#imageWidth').value);
-    canvas.height = int.parse(query('#imageHeight').value);
+    canvas.width =
+        int.parse((querySelector('#imageWidth') as InputElement).value);
+    canvas.height =
+        int.parse((querySelector('#imageHeight') as InputElement).value);
     var sw = new Stopwatch()..start();
     renderScene(e);
     sw.stop();
     time.text = sw.elapsedMilliseconds.toString();
   });
-}
\ No newline at end of file
+}
diff --git a/example/Tracer/dart/color.dart b/example/Tracer/dart/color.dart
index d71b295..ca2a63e 100644
--- a/example/Tracer/dart/color.dart
+++ b/example/Tracer/dart/color.dart
@@ -15,17 +15,16 @@
 
   void limit() {
     this.red = (this.red > 0.0) ? ((this.red > 1.0) ? 1.0 : this.red) : 0.0;
-    this.green = (this.green > 0.0) ?
-        ((this.green > 1.0) ? 1.0 : this.green) : 0.0;
-    this.blue = (this.blue > 0.0) ?
-        ((this.blue > 1.0) ? 1.0 : this.blue) : 0.0;
+    this.green =
+        (this.green > 0.0) ? ((this.green > 1.0) ? 1.0 : this.green) : 0.0;
+    this.blue = (this.blue > 0.0) ? ((this.blue > 1.0) ? 1.0 : this.blue) : 0.0;
   }
 
   Color operator +(Color c2) {
     return new Color(red + c2.red, green + c2.green, blue + c2.blue);
   }
 
-  Color addScalar(double s){
+  Color addScalar(double s) {
     var result = new Color(red + s, green + s, blue + s);
     result.limit();
     return result;
diff --git a/example/Tracer/dart/engine.dart b/example/Tracer/dart/engine.dart
index 9e53724..2696059 100644
--- a/example/Tracer/dart/engine.dart
+++ b/example/Tracer/dart/engine.dart
@@ -18,7 +18,6 @@
   String toString() => 'Intersection [$position]';
 }
 
-
 class Engine {
   int canvasWidth;
   int canvasHeight;
@@ -27,16 +26,21 @@
   int rayDepth;
   var canvas;
 
-  Engine({this.canvasWidth : 100, this.canvasHeight : 100,
-          this.pixelWidth : 2, this.pixelHeight : 2,
-          this.renderDiffuse : false, this.renderShadows : false,
-          this.renderHighlights : false, this.renderReflections : false,
-          this.rayDepth : 2}) {
+  Engine(
+      {this.canvasWidth: 100,
+      this.canvasHeight: 100,
+      this.pixelWidth: 2,
+      this.pixelHeight: 2,
+      this.renderDiffuse: false,
+      this.renderShadows: false,
+      this.renderHighlights: false,
+      this.renderReflections: false,
+      this.rayDepth: 2}) {
     canvasHeight = canvasHeight ~/ pixelHeight;
     canvasWidth = canvasWidth ~/ pixelWidth;
   }
 
-  void setPixel(int x, int y, Color color){
+  void setPixel(int x, int y, Color color) {
     var pxW, pxH;
     pxW = this.pixelWidth;
     pxH = this.pixelHeight;
@@ -60,8 +64,8 @@
     var canvasHeight = this.canvasHeight;
     var canvasWidth = this.canvasWidth;
 
-    for(var y = 0; y < canvasHeight; y++){
-      for(var x = 0; x < canvasWidth; x++){
+    for (var y = 0; y < canvasHeight; y++) {
+      for (var x = 0; x < canvasWidth; x++) {
         var yp = y * 1.0 / canvasHeight * 2 - 1;
         var xp = x * 1.0 / canvasWidth * 2 - 1;
 
@@ -75,9 +79,9 @@
     }
   }
 
-  Color getPixelColor(Ray ray, Scene scene){
+  Color getPixelColor(Ray ray, Scene scene) {
     var info = this.testIntersection(ray, scene, null);
-    if(info.isHit){
+    if (info.isHit) {
       var color = this.rayTrace(info, ray, scene, 0);
       return color;
     }
@@ -89,14 +93,14 @@
     IntersectionInfo best = new IntersectionInfo();
     best.distance = 2000;
 
-    for(var i=0; i < scene.shapes.length; i++){
+    for (var i = 0; i < scene.shapes.length; i++) {
       var shape = scene.shapes[i];
 
-      if(shape != exclude){
+      if (shape != exclude) {
         IntersectionInfo info = shape.intersect(ray);
         if (info.isHit &&
             (info.distance >= 0) &&
-            (info.distance < best.distance)){
+            (info.distance < best.distance)) {
           best = info;
           hits++;
         }
@@ -106,19 +110,18 @@
     return best;
   }
 
-  Ray getReflectionRay(Vector P, Vector N, Vector V){
+  Ray getReflectionRay(Vector P, Vector N, Vector V) {
     var c1 = -N.dot(V);
-    var R1 = N.multiplyScalar(2*c1) + V;
+    var R1 = N.multiplyScalar(2 * c1) + V;
     return new Ray(P, R1);
   }
 
   Color rayTrace(IntersectionInfo info, Ray ray, Scene scene, int depth) {
     // Calc ambient
     Color color = info.color.multiplyScalar(scene.background.ambience);
-    var oldColor = color;
     var shininess = pow(10, info.shape.material.gloss + 1);
 
-    for(var i = 0; i < scene.lights.length; i++) {
+    for (var i = 0; i < scene.lights.length; i++) {
       var light = scene.lights[i];
 
       // Calc diffuse lighting
@@ -136,12 +139,11 @@
       if (depth <= this.rayDepth) {
         // calculate reflection ray
         if (this.renderReflections && info.shape.material.reflection > 0) {
-          var reflectionRay = this.getReflectionRay(info.position,
-                                                    info.normal,
-                                                    ray.direction);
+          var reflectionRay =
+              this.getReflectionRay(info.position, info.normal, ray.direction);
           var refl = this.testIntersection(reflectionRay, scene, info.shape);
 
-          if (refl.isHit && refl.distance > 0){
+          if (refl.isHit && refl.distance > 0) {
             refl.color = this.rayTrace(refl, reflectionRay, scene, depth + 1);
           } else {
             refl.color = scene.background.color;
@@ -160,8 +162,7 @@
         var shadowRay = new Ray(info.position, v);
 
         shadowInfo = this.testIntersection(shadowRay, scene, info.shape);
-        if (shadowInfo.isHit &&
-            shadowInfo.shape != info.shape
+        if (shadowInfo.isHit && shadowInfo.shape != info.shape
             /*&& shadowInfo.shape.type != 'PLANE'*/) {
           var vA = color.multiplyScalar(0.5);
           var dB = (0.5 * pow(shadowInfo.shape.material.transparency, 0.5));
diff --git a/example/Tracer/dart/index.html b/example/Tracer/dart/index.html
index 3d62186..dba6329 100644
--- a/example/Tracer/dart/index.html
+++ b/example/Tracer/dart/index.html
@@ -33,8 +33,6 @@
     <div>
       Time (ms): <span id="time"></span>
     </div>
-    <script type="application/dart" src="app.dart"></script>
-    <!-- for this next line to work, your pubspec.yaml file must have a dependency on 'browser' -->
-    <script src="packages/browser/dart.js"></script>
+    <script defer src="app.dart.js"></script>
   </body>
 </html>
diff --git a/example/Tracer/dart/materials.dart b/example/Tracer/dart/materials.dart
index 51a43cd..e05df23 100644
--- a/example/Tracer/dart/materials.dart
+++ b/example/Tracer/dart/materials.dart
@@ -7,9 +7,9 @@
 part of ray_trace;
 
 abstract class Materials {
-  final gloss;             // [0...infinity] 0 = matt
-  final transparency;      // 0=opaque
-  final reflection;        // [0...infinity] 0 = no reflection
+  final gloss; // [0...infinity] 0 = matt
+  final transparency; // 0=opaque
+  final reflection; // [0...infinity] 0 = no reflection
   var refraction = 0.50;
   var hasTexture = false;
 
@@ -19,22 +19,18 @@
 
   wrapUp(t) {
     t = t % 2.0;
-    if(t < -1) t += 2.0;
-    if(t >= 1) t -= 2.0;
+    if (t < -1) t += 2.0;
+    if (t >= 1) t -= 2.0;
     return t;
   }
 }
 
-
 class Chessboard extends Materials {
   var colorEven, colorOdd, density;
 
-  Chessboard(this.colorEven,
-             this.colorOdd,
-             reflection,
-             transparency,
-             gloss,
-             this.density) : super(reflection, transparency, gloss) {
+  Chessboard(this.colorEven, this.colorOdd, reflection, transparency, gloss,
+      this.density)
+      : super(reflection, transparency, gloss) {
     this.hasTexture = true;
   }
 
@@ -49,7 +45,6 @@
   }
 }
 
-
 class Solid extends Materials {
   var color;
 
diff --git a/example/Tracer/dart/readme.md b/example/Tracer/dart/readme.md
new file mode 100644
index 0000000..dc3b17d
--- /dev/null
+++ b/example/Tracer/dart/readme.md
@@ -0,0 +1,4 @@
+To run:
+
+ 1) `pub run build_runner serve example` from the root
+ 2) Navigate to http://localhost:8080/Tracer/dart/
diff --git a/example/Tracer/dart/renderscene.dart b/example/Tracer/dart/renderscene.dart
index 49324aa..e995741 100644
--- a/example/Tracer/dart/renderscene.dart
+++ b/example/Tracer/dart/renderscene.dart
@@ -14,66 +14,33 @@
   Light(this.position, this.color, [this.intensity = 10.0]);
 }
 
-
 // 'event' null means that we are benchmarking
 void renderScene(event) {
   var scene = new Scene();
   scene.camera = new Camera(new Vector(0.0, 0.0, -15.0),
-                            new Vector(-0.2, 0.0, 5.0),
-                            new Vector(0.0, 1.0, 0.0));
+      new Vector(-0.2, 0.0, 5.0), new Vector(0.0, 1.0, 0.0));
   scene.background = new Background(new Color(0.5, 0.5, 0.5), 0.4);
 
-  var sphere = new Sphere(
-      new Vector(-1.5, 1.5, 2.0),
-      1.5,
-      new Solid(
-          new Color(0.0, 0.5, 0.5),
-          0.3,
-          0.0,
-          0.0,
-          2.0
-      )
-  );
+  var sphere = new Sphere(new Vector(-1.5, 1.5, 2.0), 1.5,
+      new Solid(new Color(0.0, 0.5, 0.5), 0.3, 0.0, 0.0, 2.0));
 
-  var sphere1 = new Sphere(
-      new Vector(1.0, 0.25, 1.0),
-      0.5,
-      new Solid(
-          new Color(0.9,0.9,0.9),
-          0.1,
-          0.0,
-          0.0,
-          1.5
-      )
-  );
+  var sphere1 = new Sphere(new Vector(1.0, 0.25, 1.0), 0.5,
+      new Solid(new Color(0.9, 0.9, 0.9), 0.1, 0.0, 0.0, 1.5));
 
   var plane = new Plane(
       new Vector(0.1, 0.9, -0.5).normalize(),
       1.2,
-      new Chessboard(
-          new Color(1.0, 1.0, 1.0),
-          new Color(0.0, 0.0, 0.0),
-          0.2,
-          0.0,
-          1.0,
-          0.7
-      )
-  );
+      new Chessboard(new Color(1.0, 1.0, 1.0), new Color(0.0, 0.0, 0.0), 0.2,
+          0.0, 1.0, 0.7));
 
   scene.shapes.add(plane);
   scene.shapes.add(sphere);
   scene.shapes.add(sphere1);
 
-  var light = new Light(
-      new Vector(5.0, 10.0, -1.0),
-      new Color(0.8, 0.8, 0.8)
-  );
+  var light = new Light(new Vector(5.0, 10.0, -1.0), new Color(0.8, 0.8, 0.8));
 
-  var light1 = new Light(
-      new Vector(-3.0, 5.0, -15.0),
-      new Color(0.8, 0.8, 0.8),
-      100.0
-  );
+  var light1 =
+      new Light(new Vector(-3.0, 5.0, -15.0), new Color(0.8, 0.8, 0.8), 100.0);
 
   scene.lights.add(light);
   scene.lights.add(light1);
@@ -91,27 +58,34 @@
     renderReflections = true;
     canvas = null;
   } else {
-    imageWidth = int.parse(query('#imageWidth').value);
-    imageHeight = int.parse(query('#imageHeight').value);
-    pixelSize = int.parse(query('#pixelSize').value.split(',')[0]);
-    renderDiffuse = query('#renderDiffuse').checked;
-    renderShadows = query('#renderShadows').checked;
-    renderHighlights = query('#renderHighlights').checked;
-    renderReflections = query('#renderReflections').checked;
-    canvas = query("#canvas");
+    imageWidth =
+        int.parse((querySelector('#imageWidth') as InputElement).value);
+    imageHeight =
+        int.parse((querySelector('#imageHeight') as InputElement).value);
+    pixelSize = int.parse(
+        (querySelector('#pixelSize') as InputElement).value.split(',')[0]);
+    renderDiffuse =
+        (querySelector('#renderDiffuse') as CheckboxInputElement).checked;
+    renderShadows =
+        (querySelector('#renderShadows') as CheckboxInputElement).checked;
+    renderHighlights =
+        (querySelector('#renderHighlights') as CheckboxInputElement).checked;
+    renderReflections =
+        (querySelector('#renderReflections') as CheckboxInputElement).checked;
+    canvas = querySelector("#canvas");
   }
   int rayDepth = 2;
 
-  var raytracer = new Engine(canvasWidth:imageWidth,
-                             canvasHeight:imageHeight,
-                             pixelWidth: pixelSize,
-                             pixelHeight: pixelSize,
-                             renderDiffuse: renderDiffuse,
-                             renderShadows: renderShadows,
-                             renderReflections: renderReflections,
-                             renderHighlights: renderHighlights,
-                             rayDepth: rayDepth
-                             );
+  var raytracer = new Engine(
+      canvasWidth: imageWidth,
+      canvasHeight: imageHeight,
+      pixelWidth: pixelSize,
+      pixelHeight: pixelSize,
+      renderDiffuse: renderDiffuse,
+      renderShadows: renderShadows,
+      renderReflections: renderReflections,
+      renderHighlights: renderHighlights,
+      rayDepth: rayDepth);
 
   raytracer.renderScene(scene, canvas);
 }
diff --git a/example/Tracer/dart/scene.dart b/example/Tracer/dart/scene.dart
index 4c9674f..499ec84 100644
--- a/example/Tracer/dart/scene.dart
+++ b/example/Tracer/dart/scene.dart
@@ -16,7 +16,6 @@
   }
 }
 
-
 class Camera {
   final position;
   final lookAt;
@@ -29,8 +28,8 @@
   }
 
   Ray getRay(double vx, double vy) {
-    var pos = screen -
-        (this.equator.multiplyScalar(vx) - this.up.multiplyScalar(vy));
+    var pos =
+        screen - (this.equator.multiplyScalar(vx) - this.up.multiplyScalar(vy));
     pos.y = pos.y * -1.0;
     var dir = pos - this.position;
     var ray = new Ray(pos, dir.normalize());
@@ -42,7 +41,6 @@
   }
 }
 
-
 class Background {
   final Color color;
   final double ambience;
@@ -50,16 +48,14 @@
   Background(this.color, this.ambience);
 }
 
-
 class Scene {
   var camera;
   var shapes;
   var lights;
   var background;
   Scene() {
-    camera = new Camera(new Vector(0.0, 0.0, -0.5),
-                        new Vector(0.0, 0.0, 1.0),
-                        new Vector(0.0, 1.0, 0.0));
+    camera = new Camera(new Vector(0.0, 0.0, -0.5), new Vector(0.0, 0.0, 1.0),
+        new Vector(0.0, 1.0, 0.0));
     shapes = new List();
     lights = new List();
     background = new Background(new Color(0.0, 0.0, 0.5), 0.2);
diff --git a/example/Tracer/dart/shapes.dart b/example/Tracer/dart/shapes.dart
index 9dc9923..254ece8 100644
--- a/example/Tracer/dart/shapes.dart
+++ b/example/Tracer/dart/shapes.dart
@@ -17,7 +17,6 @@
   }
 }
 
-
 class Plane extends BaseShape {
   final d;
 
@@ -38,14 +37,14 @@
     info.normal = this.position;
     info.distance = t;
 
-    if(this.material.hasTexture){
+    if (this.material.hasTexture) {
       var vU = new Vector(this.position.y, this.position.z, -this.position.x);
       var vV = vU.cross(this.position);
       var u = info.position.dot(vU);
       var v = info.position.dot(vV);
-      info.color = this.material.getColor(u,v);
+      info.color = this.material.getColor(u, v);
     } else {
-      info.color = this.material.getColor(0,0);
+      info.color = this.material.getColor(0, 0);
     }
 
     return info;
@@ -56,12 +55,11 @@
   }
 }
 
-
 class Sphere extends BaseShape {
   var radius;
-  Sphere(pos, radius, material) : super(pos, material), this.radius = radius;
+  Sphere(pos, this.radius, material) : super(pos, material);
 
-  IntersectionInfo intersect(Ray ray){
+  IntersectionInfo intersect(Ray ray) {
     var info = new IntersectionInfo();
     info.shape = this;
 
@@ -71,14 +69,15 @@
     var C = dst.dot(dst) - (this.radius * this.radius);
     var D = (B * B) - C;
 
-    if (D > 0) { // intersection!
+    if (D > 0) {
+      // intersection!
       info.isHit = true;
       info.distance = (-B) - sqrt(D);
-      info.position = ray.position +
-          ray.direction.multiplyScalar(info.distance);
+      info.position =
+          ray.position + ray.direction.multiplyScalar(info.distance);
       info.normal = (info.position - this.position).normalize();
 
-      info.color = this.material.getColor(0,0);
+      info.color = this.material.getColor(0, 0);
     } else {
       info.isHit = false;
     }
@@ -89,4 +88,3 @@
     return 'Sphere [position=$position, radius=$radius]';
   }
 }
-
diff --git a/example/Tracer/dart/vector.dart b/example/Tracer/dart/vector.dart
index ab3495b..4763fad 100644
--- a/example/Tracer/dart/vector.dart
+++ b/example/Tracer/dart/vector.dart
@@ -26,9 +26,8 @@
   }
 
   Vector cross(Vector w) {
-    return new Vector(-this.z * w.y + this.y * w.z,
-                      this.z * w.x - this.x * w.z,
-                      -this.y * w.x + this.x * w.y);
+    return new Vector(-this.z * w.y + this.y * w.z, this.z * w.x - this.x * w.z,
+        -this.y * w.x + this.x * w.y);
   }
 
   double dot(Vector w) {
diff --git a/lib/src/benchmark_base.dart b/lib/src/benchmark_base.dart
index c72b330..9273ebf 100644
--- a/lib/src/benchmark_base.dart
+++ b/lib/src/benchmark_base.dart
@@ -7,14 +7,13 @@
   final ScoreEmitter emitter;
 
   // Empty constructor.
-  const BenchmarkBase(String name,
-      { ScoreEmitter emitter: const PrintEmitter() })
+  const BenchmarkBase(String name, {ScoreEmitter emitter: const PrintEmitter()})
       : this.name = name,
         this.emitter = emitter;
 
   // The benchmark code.
   // This function is not used, if both [warmup] and [exercise] are overwritten.
-  void run() { }
+  void run() {}
 
   // Runs a short version of the benchmark. By default invokes [run] once.
   void warmup() {
@@ -29,10 +28,10 @@
   }
 
   // Not measured setup code executed prior to the benchmark runs.
-  void setup() { }
+  void setup() {}
 
   // Not measures teardown code executed after the benchark runs.
-  void teardown() { }
+  void teardown() {}
 
   // Measures the score for this benchmark by executing it repeately until
   // time minimum has been reached.
@@ -54,9 +53,13 @@
   double measure() {
     setup();
     // Warmup for at least 100ms. Discard result.
-    measureFor(() { this.warmup(); }, 100);
+    measureFor(() {
+      this.warmup();
+    }, 100);
     // Run the benchmark for at least 2000ms.
-    double result = measureFor(() { this.exercise(); }, 2000);
+    double result = measureFor(() {
+      this.exercise();
+    }, 2000);
     teardown();
     return result;
   }
@@ -64,5 +67,4 @@
   void report() {
     emitter.emit(name, measure());
   }
-
 }
diff --git a/pubspec.yaml b/pubspec.yaml
index 600ef22..fab6326 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,13 +1,15 @@
 name: benchmark_harness
-version: 1.0.5-dev
+version: 1.0.5
 author: Dart Team <misc@dartlang.org>
 description: The official Dart project benchmark harness.
 homepage: https://github.com/dart-lang/benchmark_harness
-dependencies:
-  browser: '>=0.10.0+2 <0.11.0'
+
+environment:
+  sdk: ">=2.0.0-dev <3.0.0"
+
 dev_dependencies:
-  hop: '>=0.30.3 <0.32.0'
-  hop_unittest: any
-  mock: '>=0.11.0 <0.12.0'
-  path: '>=1.1.0 <2.0.0'
-  unittest: '>=0.10.0 <0.12.0'
+  build_runner: ^0.9.0
+  build_web_compilers: ^0.4.0
+  mockito: ^3.0.0
+  path: ^1.1.0
+  test: ^1.0.0
diff --git a/test/benchmark_harness_test.dart b/test/benchmark_harness_test.dart
index ae06e7a..c1b287f 100644
--- a/test/benchmark_harness_test.dart
+++ b/test/benchmark_harness_test.dart
@@ -5,7 +5,7 @@
 library benchmark_harness_test;
 
 import 'package:benchmark_harness/benchmark_harness.dart';
-import 'package:unittest/unittest.dart';
+import 'package:test/test.dart';
 
 void main() {
   group('benchmark_harness', () {
diff --git a/test/drone.sh b/test/drone.sh
deleted file mode 100755
index 2568f38..0000000
--- a/test/drone.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-# get the packages
-pub install
-
-# analyze the code
-dart tool/hop_runner.dart analyze_all
-
-# run the tests
-dart tool/hop_runner.dart test
diff --git a/test/fixed-unittest.dart b/test/fixed-unittest.dart
deleted file mode 100644
index 4f8951c..0000000
--- a/test/fixed-unittest.dart
+++ /dev/null
@@ -1,9 +0,0 @@
-library fixed_unittest;
-
-import 'package:unittest/unittest.dart';
-
-export 'package:unittest/unittest.dart';
-
-// Jasmine-like syntax for unittest.
-void describe(String spec, TestFunction body) => group(spec, body);
-void it(String spec, TestFunction body) => test(spec, body);
diff --git a/test/result_emitter_test.dart b/test/result_emitter_test.dart
index ef4b61a..82c45a7 100644
--- a/test/result_emitter_test.dart
+++ b/test/result_emitter_test.dart
@@ -1,38 +1,26 @@
 library result_emitter_test;
 
 import 'package:benchmark_harness/benchmark_harness.dart';
-import 'package:mock/mock.dart';
+import 'package:mockito/mockito.dart';
 
-import 'fixed-unittest.dart';
+import 'package:test/test.dart';
 
 void main() {
   benchmarkHarnessTest();
 }
 
-class MockResultEmitter extends Mock implements ScoreEmitter {
-  var hasEmitted = false;
-
-  MockResultEmitter() {
-    when(callsTo('emit')).alwaysCall(fakeEmit);
-  }
-
-  void fakeEmit(String name, double value) {
-    hasEmitted = true;
-  }
-
-  // Added to quiet an analyzer warning.
-  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
-}
+class MockResultEmitter extends Mock implements ScoreEmitter {}
 
 // Create a new benchmark which has an emitter.
 class BenchmarkWithResultEmitter extends BenchmarkBase {
-  const BenchmarkWithResultEmitter(ScoreEmitter emitter) : super("Template", emitter: emitter);
+  const BenchmarkWithResultEmitter(ScoreEmitter emitter)
+      : super("Template", emitter: emitter);
 
-  void run() { }
+  void run() {}
 
-  void setup() { }
+  void setup() {}
 
-  void teardown() { }
+  void teardown() {}
 }
 
 benchmarkHarnessTest() {
@@ -41,12 +29,13 @@
     return emitter;
   }
 
-  describe('ResultEmitter', () {
-    it('should be called when emitter is provided', () {
+  group('ResultEmitter', () {
+    test('should be called when emitter is provided', () {
       MockResultEmitter emitter = createMockEmitter();
       var testBenchmark = new BenchmarkWithResultEmitter(emitter);
       testBenchmark.report();
-      emitter.getLogs(callsTo('emit')).verify(happenedOnce);
+
+      verify(emitter.emit(any, any)).called(1);
     });
   });
 }
diff --git a/tool/hop_runner.dart b/tool/hop_runner.dart
deleted file mode 100755
index 30df07a..0000000
--- a/tool/hop_runner.dart
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/usr/bin/env dart
-library hop_runner;
-
-import 'dart:async';
-import 'dart:io';
-
-import 'package:hop/hop.dart';
-import 'package:hop/hop_tasks.dart';
-import 'package:hop_unittest/hop_unittest.dart';
-
-import 'package:path/path.dart' as path;
-
-import '../test/benchmark_harness_test.dart' as benchmark_harness_test;
-import '../test/result_emitter_test.dart' as result_emitter_test;
-
-void main(List<String> args) {
-  addTask('analyze_libs', createAnalyzerTask(_getDartFiles('lib')));
-  addTask('analyze_examples', createAnalyzerTask(_getDartFiles('example')));
-  addTask('analyze_tests', createAnalyzerTask(_getDartFiles('test')));
-
-  addChainedTask('analyze_all',
-      ['analyze_libs', 'analyze_examples', 'analyze_tests']);
-
-  addTask('test', createUnitTestTask((){
-    benchmark_harness_test.main();
-    result_emitter_test.main();
-  }));
-
-  runHop(args);
-}
-
-Future<List<String>> _getDartFiles(String directory) =>
-  new Directory(directory)
-    .list()
-    .where((FileSystemEntity fse) => fse is File)
-    .map((File file) => file.path)
-    .where((String filePath) => path.extension(filePath) == '.dart')
-    .toList();
