diff --git a/codereview.settings b/codereview.settings
index 88a854a..5b6ee67 100644
--- a/codereview.settings
+++ b/codereview.settings
@@ -1,3 +1,3 @@
-CODE_REVIEW_SERVER: http://codereview.chromium.org/
-VIEW_VC: https://github.com/dart-lang/glob/commit/
+CODE_REVIEW_SERVER: https://codereview.chromium.org/
+VIEW_VC: https://github.com/dart-lang/shelf/commit/
 CC_LIST: reviews@dartlang.org
\ No newline at end of file
diff --git a/example/example_server.dart b/example/example_server.dart
index ca0210b..5abc65e 100644
--- a/example/example_server.dart
+++ b/example/example_server.dart
@@ -6,7 +6,8 @@
 import 'package:shelf/shelf_io.dart' as io;
 
 void main() {
-  var handler = const shelf.Pipeline().addMiddleware(shelf.logRequests())
+  var handler = const shelf.Pipeline()
+      .addMiddleware(shelf.logRequests())
       .addHandler(_echoRequest);
 
   io.serve(handler, 'localhost', 8080).then((server) {
diff --git a/lib/shelf_io.dart b/lib/shelf_io.dart
index 878935f..4ca48b6 100644
--- a/lib/shelf_io.dart
+++ b/lib/shelf_io.dart
@@ -23,8 +23,7 @@
 ///
 /// See the documentation for [HttpServer.bind] for more details on [address],
 /// [port], and [backlog].
-Future<HttpServer> serve(Handler handler, address, int port,
-    {int backlog}) {
+Future<HttpServer> serve(Handler handler, address, int port, {int backlog}) {
   if (backlog == null) backlog = 0;
   return HttpServer.bind(address, port, backlog: backlog).then((server) {
     serveRequests(server, handler);
@@ -81,11 +80,11 @@
       response = _logError('null response from handler.');
     } else if (!shelfRequest.canHijack) {
       var message = new StringBuffer()
-          ..writeln("Got a response for hijacked request "
-              "${shelfRequest.method} ${shelfRequest.requestedUri}:")
-          ..writeln(response.statusCode);
-      response.headers.forEach((key, value) =>
-          message.writeln("${key}: ${value}"));
+        ..writeln("Got a response for hijacked request "
+            "${shelfRequest.method} ${shelfRequest.requestedUri}:")
+        ..writeln(response.statusCode);
+      response.headers
+          .forEach((key, value) => message.writeln("${key}: ${value}"));
       throw new Exception(message.toString().trim());
     }
 
@@ -106,13 +105,16 @@
   });
 
   onHijack(callback) {
-    return request.response.detachSocket(writeHeaders: false)
+    return request.response
+        .detachSocket(writeHeaders: false)
         .then((socket) => callback(socket, socket));
   }
 
   return new Request(request.method, request.requestedUri,
-      protocolVersion: request.protocolVersion, headers: headers,
-      body: request, onHijack: onHijack);
+      protocolVersion: request.protocolVersion,
+      headers: headers,
+      body: request,
+      onHijack: onHijack);
 }
 
 Future _writeResponse(Response response, HttpResponse httpResponse) {
@@ -131,7 +133,8 @@
     httpResponse.headers.date = new DateTime.now().toUtc();
   }
 
-  return httpResponse.addStream(response.read())
+  return httpResponse
+      .addStream(response.read())
       .then((_) => httpResponse.close());
 }
 
@@ -143,8 +146,7 @@
     chain = new Chain.forTrace(stackTrace);
   }
   chain = chain
-      .foldFrames((frame) => frame.isCore || frame.package == 'shelf')
-      .terse;
+      .foldFrames((frame) => frame.isCore || frame.package == 'shelf').terse;
 
   stderr.writeln('ERROR - ${new DateTime.now()}');
   stderr.writeln(message);
diff --git a/lib/src/cascade.dart b/lib/src/cascade.dart
index 778acec..f4e7cad 100644
--- a/lib/src/cascade.dart
+++ b/lib/src/cascade.dart
@@ -81,8 +81,8 @@
 
 /// Computes the [Cascade._shouldCascade] function based on the user's
 /// parameters.
-Function _computeShouldCascade(Iterable<int> statusCodes,
-    Function shouldCascade) {
+Function _computeShouldCascade(
+    Iterable<int> statusCodes, Function shouldCascade) {
   if (shouldCascade != null) return shouldCascade;
   if (statusCodes == null) statusCodes = [404, 405];
   statusCodes = statusCodes.toSet();
diff --git a/lib/src/handlers/logger.dart b/lib/src/handlers/logger.dart
index e949c9b..f0833d7 100644
--- a/lib/src/handlers/logger.dart
+++ b/lib/src/handlers/logger.dart
@@ -50,24 +50,21 @@
   };
 };
 
-String _getMessage(DateTime requestTime, int statusCode, Uri url,
-  String method, Duration elapsedTime) {
-
+String _getMessage(DateTime requestTime, int statusCode, Uri url, String method,
+    Duration elapsedTime) {
   return '${requestTime}\t$elapsedTime\t$method\t[${statusCode}]\t${url}';
 }
 
-String _getErrorMessage(DateTime requestTime, Uri url,
-  String method, Duration elapsedTime, Object error, StackTrace stack) {
-
+String _getErrorMessage(DateTime requestTime, Uri url, String method,
+    Duration elapsedTime, Object error, StackTrace stack) {
   var chain = new Chain.current();
   if (stack != null) {
     chain = new Chain.forTrace(stack)
-      .foldFrames((frame) => frame.isCore || frame.package == 'shelf')
-      .terse;
+        .foldFrames((frame) => frame.isCore || frame.package == 'shelf').terse;
   }
 
   var msg = '${requestTime}\t$elapsedTime\t$method\t${url}\n$error';
-  if(chain == null) return msg;
+  if (chain == null) return msg;
 
   return '$msg\n$chain';
 }
diff --git a/lib/src/hijack_exception.dart b/lib/src/hijack_exception.dart
index 13c5054..56d5cec 100644
--- a/lib/src/hijack_exception.dart
+++ b/lib/src/hijack_exception.dart
@@ -17,5 +17,5 @@
   String toString() =>
       "A shelf request's underlying data stream was hijacked.\n"
       "This exception is used for control flow and should only be handled by a "
-        "Shelf adapter.";
+      "Shelf adapter.";
 }
diff --git a/lib/src/message.dart b/lib/src/message.dart
index 514eb48..ba5c5fa 100644
--- a/lib/src/message.dart
+++ b/lib/src/message.dart
@@ -46,10 +46,10 @@
   /// Creates a new [Message].
   ///
   /// If [headers] is `null`, it is treated as empty.
-  Message(this._body, {Map<String, String> headers,
-        Map<String, Object> context})
+  Message(this._body,
+      {Map<String, String> headers, Map<String, Object> context})
       : this.headers = new ShelfUnmodifiableMap<String>(headers,
-            ignoreKeyCase: true),
+          ignoreKeyCase: true),
         this.context = new ShelfUnmodifiableMap<Object>(context,
             ignoreKeyCase: false);
 
@@ -107,7 +107,7 @@
   Stream<List<int>> read() {
     if (_bodyWasRead) {
       throw new StateError("The 'read' method can only be called once on a "
-                           "shelf.Request/shelf.Response object.");
+          "shelf.Request/shelf.Response object.");
     }
     _bodyWasRead = true;
     return _body;
diff --git a/lib/src/middleware.dart b/lib/src/middleware.dart
index b81b70d..dcd984b 100644
--- a/lib/src/middleware.dart
+++ b/lib/src/middleware.dart
@@ -67,8 +67,8 @@
       return syncFuture(() => requestHandler(request)).then((response) {
         if (response != null) return response;
 
-        return syncFuture(() => innerHandler(request))
-            .then((response) => responseHandler(response), onError: onError);
+        return syncFuture(() => innerHandler(request)).then(
+            (response) => responseHandler(response), onError: onError);
       });
     };
   };
diff --git a/lib/src/request.dart b/lib/src/request.dart
index 15d8b87..5f6e960 100644
--- a/lib/src/request.dart
+++ b/lib/src/request.dart
@@ -120,10 +120,14 @@
       Map<String, String> headers, Uri url, String scriptName,
       Stream<List<int>> body, Map<String, Object> context,
       OnHijackCallback onHijack})
-        : this._(method, requestedUri, protocolVersion: protocolVersion,
-            headers: headers, url: url, scriptName: scriptName,
-            body: body, context: context,
-            onHijack: onHijack == null ? null : new _OnHijack(onHijack));
+      : this._(method, requestedUri,
+          protocolVersion: protocolVersion,
+          headers: headers,
+          url: url,
+          scriptName: scriptName,
+          body: body,
+          context: context,
+          onHijack: onHijack == null ? null : new _OnHijack(onHijack));
 
   /// This constructor has the same signature as [new Request] except that
   /// accepts [onHijack] as [_OnHijack].
@@ -132,12 +136,12 @@
   /// source [Request] to ensure that [hijack] can only be called once, even
   /// from a changed [Request].
   Request._(this.method, Uri requestedUri, {String protocolVersion,
-    Map<String, String> headers, Uri url, String scriptName,
-    Stream<List<int>> body, Map<String, Object> context,
-    _OnHijack onHijack})
+      Map<String, String> headers, Uri url, String scriptName,
+      Stream<List<int>> body, Map<String, Object> context, _OnHijack onHijack})
       : this.requestedUri = requestedUri,
-        this.protocolVersion = protocolVersion == null ?
-            '1.1' : protocolVersion,
+        this.protocolVersion = protocolVersion == null
+            ? '1.1'
+            : protocolVersion,
         this.url = _computeUrl(requestedUri, url, scriptName),
         this.scriptName = _computeScriptName(requestedUri, url, scriptName),
         this._onHijack = onHijack,
@@ -191,7 +195,7 @@
   /// removed. Useful for routing middleware that sends requests to an inner
   /// [Handler].
   Request change({Map<String, String> headers, Map<String, Object> context,
-    String scriptName, Uri url}) {
+      String scriptName, Uri url}) {
     headers = updateMap(this.headers, headers);
     context = updateMap(this.context, context);
 
@@ -210,8 +214,12 @@
     if (scriptName == null) scriptName = this.scriptName;
 
     return new Request._(this.method, this.requestedUri,
-        protocolVersion: this.protocolVersion, headers: headers, url: url,
-        scriptName: scriptName, body: this.read(), context: context,
+        protocolVersion: this.protocolVersion,
+        headers: headers,
+        url: url,
+        scriptName: scriptName,
+        body: this.read(),
+        context: context,
         onHijack: _onHijack);
   }
 
diff --git a/lib/src/response.dart b/lib/src/response.dart
index f95fdb7..0298813 100644
--- a/lib/src/response.dart
+++ b/lib/src/response.dart
@@ -276,8 +276,8 @@
 /// Adds a header with [name] and [value] to [headers], which may be null.
 ///
 /// Returns a new map without modifying [headers].
-Map<String, String> _addHeader(Map<String, String> headers, String name,
-    String value) {
+Map<String, String> _addHeader(
+    Map<String, String> headers, String name, String value) {
   headers = headers == null ? {} : new Map.from(headers);
   headers[name] = value;
   return headers;
diff --git a/lib/src/shelf_unmodifiable_map.dart b/lib/src/shelf_unmodifiable_map.dart
index 7cb5553..9b56443 100644
--- a/lib/src/shelf_unmodifiable_map.dart
+++ b/lib/src/shelf_unmodifiable_map.dart
@@ -31,8 +31,8 @@
     }
 
     if (ignoreKeyCase) {
-      source = new pc.CanonicalizedMap<String, String, V>.from(source,
-          (key) => key.toLowerCase(), isValidKey: (key) => key != null);
+      source = new pc.CanonicalizedMap<String, String, V>.from(
+          source, (key) => key.toLowerCase(), isValidKey: (key) => key != null);
     } else {
       source = new Map<String, V>.from(source);
     }
@@ -47,6 +47,6 @@
 // TODO(kevmoo): Consider using MapView from dart:collection which has a const
 // ctor. Would require updating min SDK to 1.5.
 class _EmptyShelfUnmodifiableMap<V> extends pc.DelegatingMap<String, V>
-    implements ShelfUnmodifiableMap<V>  {
+    implements ShelfUnmodifiableMap<V> {
   const _EmptyShelfUnmodifiableMap() : super(const {});
 }
diff --git a/lib/src/util.dart b/lib/src/util.dart
index b668177..270ea6b 100644
--- a/lib/src/util.dart
+++ b/lib/src/util.dart
@@ -38,6 +38,5 @@
 Map updateMap(Map original, Map updates) {
   if (updates == null || updates.isEmpty) return original;
 
-  return new Map.from(original)
-      ..addAll(updates);
+  return new Map.from(original)..addAll(updates);
 }
diff --git a/pubspec.yaml b/pubspec.yaml
index 520bfe3..57ec073 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: shelf
-version: 0.5.6
+version: 0.5.7-dev
 author: Dart Team <misc@dartlang.org>
 description: Web Server Middleware for Dart
 homepage: https://github.com/dart-lang/shelf
diff --git a/test/cascade_test.dart b/test/cascade_test.dart
index 59dfcfa..bf21aeb 100644
--- a/test/cascade_test.dart
+++ b/test/cascade_test.dart
@@ -45,8 +45,8 @@
     test("the second response should be returned if it matches and the first "
         "doesn't", () {
       return syncFuture(() {
-        return handler(new Request('GET', LOCALHOST_URI,
-            headers: {'one': 'false'}));
+        return handler(
+            new Request('GET', LOCALHOST_URI, headers: {'one': 'false'}));
       }).then((response) {
         expect(response.statusCode, equals(200));
         expect(response.readAsString(), completion(equals('handler 2')));
@@ -115,7 +115,7 @@
 
   test('[shouldCascade] controls which responses cause cascading', () {
     var handler = new Cascade(
-          shouldCascade: (response) => response.statusCode % 2 == 1)
+            shouldCascade: (response) => response.statusCode % 2 == 1)
         .add((_) => new Response.movedPermanently('/'))
         .add((_) => new Response.forbidden('handler 2'))
         .add((_) => new Response.notFound('handler 3'))
@@ -135,8 +135,8 @@
 
     test('passing [statusCodes] and [shouldCascade] at the same time fails',
         () {
-      expect(() => new Cascade(
-            statusCodes: [404, 405], shouldCascade: (_) => false),
+      expect(() =>
+              new Cascade(statusCodes: [404, 405], shouldCascade: (_) => false),
           throwsArgumentError);
     });
   });
diff --git a/test/create_middleware_test.dart b/test/create_middleware_test.dart
index a743dd5..815f518 100644
--- a/test/create_middleware_test.dart
+++ b/test/create_middleware_test.dart
@@ -16,8 +16,8 @@
     var handler = const Pipeline()
         .addMiddleware(createMiddleware())
         .addHandler((request) {
-          return syncHandler(request, headers: {'from' : 'innerHandler'});
-        });
+      return syncHandler(request, headers: {'from': 'innerHandler'});
+    });
 
     return makeSimpleRequest(handler).then((response) {
       expect(response.headers['from'], 'innerHandler');
@@ -59,8 +59,9 @@
 
     test('async response is returned', () {
       var handler = const Pipeline()
-          .addMiddleware(createMiddleware(requestHandler: (request) =>
-              new Future.value(_middlewareResponse)))
+          .addMiddleware(createMiddleware(
+              requestHandler: (request) =>
+                  new Future.value(_middlewareResponse)))
           .addHandler(_failHandler);
 
       return makeSimpleRequest(handler).then((response) {
@@ -74,9 +75,8 @@
             requestHandler: (request) => _middlewareResponse,
             responseHandler: (response) => fail('should not be called'));
 
-        var handler = const Pipeline()
-            .addMiddleware(middleware)
-            .addHandler(syncHandler);
+        var handler =
+            const Pipeline().addMiddleware(middleware).addHandler(syncHandler);
 
         return makeSimpleRequest(handler).then((response) {
           expect(response.headers['from'], 'middleware');
@@ -87,9 +87,8 @@
         var middleware = createMiddleware(
             requestHandler: (request) => new Future.value(_middlewareResponse),
             responseHandler: (response) => fail('should not be called'));
-        var handler = const Pipeline()
-            .addMiddleware(middleware)
-            .addHandler(syncHandler);
+        var handler =
+            const Pipeline().addMiddleware(middleware).addHandler(syncHandler);
 
         return makeSimpleRequest(handler).then((response) {
           expect(response.headers['from'], 'middleware');
@@ -100,12 +99,12 @@
 
   group('responseHandler', () {
     test('innerHandler sync response is seen, replaced value continues', () {
-      var handler = const Pipeline().addMiddleware(createMiddleware(
-          responseHandler: (response) {
+      var handler = const Pipeline()
+          .addMiddleware(createMiddleware(responseHandler: (response) {
         expect(response.headers['from'], 'handler');
         return _middlewareResponse;
       })).addHandler((request) {
-        return syncHandler(request, headers: {'from' : 'handler'} );
+        return syncHandler(request, headers: {'from': 'handler'});
       });
 
       return makeSimpleRequest(handler).then((response) {
@@ -114,13 +113,13 @@
     });
 
     test('innerHandler async response is seen, async value continues', () {
-      var handler = const Pipeline().addMiddleware(
-          createMiddleware(responseHandler: (response) {
+      var handler = const Pipeline()
+          .addMiddleware(createMiddleware(responseHandler: (response) {
         expect(response.headers['from'], 'handler');
         return new Future.value(_middlewareResponse);
       })).addHandler((request) {
-        return new Future(() => syncHandler(
-            request, headers: {'from' : 'handler'} ));
+        return new Future(
+            () => syncHandler(request, headers: {'from': 'handler'}));
       });
 
       return makeSimpleRequest(handler).then((response) {
@@ -141,8 +140,9 @@
 
     test('async error thrown by requestHandler bubbles down', () {
       var handler = const Pipeline()
-          .addMiddleware(createMiddleware(requestHandler: (request) =>
-              new Future.error('middleware error')))
+          .addMiddleware(createMiddleware(
+              requestHandler: (request) =>
+                  new Future.error('middleware error')))
           .addHandler(_failHandler);
 
       expect(makeSimpleRequest(handler), throwsA('middleware error'));
@@ -153,33 +153,31 @@
         throw 'middleware error';
       }, errorHandler: (e, s) => fail('should never get here'));
 
-      var handler = const Pipeline().addMiddleware(middleware)
-          .addHandler(syncHandler);
+      var handler =
+          const Pipeline().addMiddleware(middleware).addHandler(syncHandler);
 
       expect(makeSimpleRequest(handler), throwsA('middleware error'));
     });
 
     test('requestHandler throw does not hit errorHandlers', () {
-      var middleware = createMiddleware(
-          requestHandler: (request) {
-            throw 'middleware error';
-          },
-          errorHandler: (e, s) => fail('should never get here'));
+      var middleware = createMiddleware(requestHandler: (request) {
+        throw 'middleware error';
+      }, errorHandler: (e, s) => fail('should never get here'));
 
-      var handler = const Pipeline().addMiddleware(middleware)
-          .addHandler(syncHandler);
+      var handler =
+          const Pipeline().addMiddleware(middleware).addHandler(syncHandler);
 
       expect(makeSimpleRequest(handler), throwsA('middleware error'));
     });
 
     test('inner handler throws, is caught by errorHandler with response', () {
-      var middleware = createMiddleware(
-          errorHandler: (error, stack) {
-            expect(error, 'bad handler');
-            return _middlewareResponse;
-          });
+      var middleware = createMiddleware(errorHandler: (error, stack) {
+        expect(error, 'bad handler');
+        return _middlewareResponse;
+      });
 
-      var handler = const Pipeline().addMiddleware(middleware)
+      var handler = const Pipeline()
+          .addMiddleware(middleware)
           .addHandler((request) {
         throw 'bad handler';
       });
@@ -195,7 +193,8 @@
         throw error;
       });
 
-      var handler = const Pipeline().addMiddleware(middleware)
+      var handler = const Pipeline()
+          .addMiddleware(middleware)
           .addHandler((request) {
         throw 'bad handler';
       });
@@ -207,7 +206,8 @@
         'rethrown', () {
       var middleware = createMiddleware();
 
-      var handler = const Pipeline().addMiddleware(middleware)
+      var handler = const Pipeline()
+          .addMiddleware(middleware)
           .addHandler((request) {
         throw 'bad handler';
       });
@@ -220,7 +220,8 @@
         fail("error handler shouldn't be called");
       });
 
-      var handler = const Pipeline().addMiddleware(middleware)
+      var handler = const Pipeline()
+          .addMiddleware(middleware)
           .addHandler((request) => throw const HijackException());
 
       expect(makeSimpleRequest(handler),
diff --git a/test/hijack_test.dart b/test/hijack_test.dart
index ee4255a..d7c6e6f 100644
--- a/test/hijack_test.dart
+++ b/test/hijack_test.dart
@@ -53,8 +53,7 @@
     test('hijacking a non-hijackable request throws a StateError', () {
       var request = new Request('GET', LOCALHOST_URI);
       var newRequest = request.change();
-      expect(() => newRequest.hijack((_, __) => null),
-          throwsStateError);
+      expect(() => newRequest.hijack((_, __) => null), throwsStateError);
     });
 
     test('hijacking a hijackable request throws a HijackException and calls '
diff --git a/test/message_change_test.dart b/test/message_change_test.dart
index f77edd1..14f8ec2 100644
--- a/test/message_change_test.dart
+++ b/test/message_change_test.dart
@@ -14,23 +14,22 @@
 void main() {
   group('Request', () {
     _testChange(({headers, context}) {
-      return new Request('GET', LOCALHOST_URI, headers: headers,
-          context: context);
+      return new Request('GET', LOCALHOST_URI,
+          headers: headers, context: context);
     });
   });
 
   group('Response', () {
     _testChange(({headers, context}) {
-      return new Response.ok(null, headers: headers,
-          context: context);
+      return new Response.ok(null, headers: headers, context: context);
     });
   });
 }
 
 /// Shared test method used by [Request] and [Response] tests to validate
 /// the behavior of `change` with different `headers` and `context` values.
-void _testChange(Message factory({Map<String, String> headers,
-  Map<String, Object> context})) {
+void _testChange(Message factory(
+    {Map<String, String> headers, Map<String, Object> context})) {
   test('with empty headers returns indentical instance', () {
     var request = factory(headers: {'header1': 'header value 1'});
     var copy = request.change(headers: {});
@@ -46,30 +45,30 @@
   });
 
   test('new header values are added', () {
-    var request = factory(headers: {'test':'test value'});
+    var request = factory(headers: {'test': 'test value'});
     var copy = request.change(headers: {'test2': 'test2 value'});
 
-    expect(copy.headers, {'test':'test value', 'test2':'test2 value'});
+    expect(copy.headers, {'test': 'test value', 'test2': 'test2 value'});
   });
 
   test('existing header values are overwritten', () {
-    var request = factory(headers: {'test':'test value'});
+    var request = factory(headers: {'test': 'test value'});
     var copy = request.change(headers: {'test': 'new test value'});
 
-    expect(copy.headers, {'test':'new test value'});
+    expect(copy.headers, {'test': 'new test value'});
   });
 
   test('new context values are added', () {
-    var request = factory(context: {'test':'test value'});
+    var request = factory(context: {'test': 'test value'});
     var copy = request.change(context: {'test2': 'test2 value'});
 
-    expect(copy.context, {'test':'test value', 'test2':'test2 value'});
+    expect(copy.context, {'test': 'test value', 'test2': 'test2 value'});
   });
 
   test('existing context values are overwritten', () {
-    var request = factory(context: {'test':'test value'});
+    var request = factory(context: {'test': 'test value'});
     var copy = request.change(context: {'test': 'new test value'});
 
-    expect(copy.context, {'test':'new test value'});
+    expect(copy.context, {'test': 'new test value'});
   });
 }
diff --git a/test/message_test.dart b/test/message_test.dart
index 1d84110..669d9ff 100644
--- a/test/message_test.dart
+++ b/test/message_test.dart
@@ -14,8 +14,7 @@
 
 class _TestMessage extends Message {
   _TestMessage(Map<String, String> headers, Map<String, Object> context,
-        Stream<List<int>> body)
-      : super(body, headers: headers, context: context);
+      Stream<List<int>> body) : super(body, headers: headers, context: context);
 
   Message change({Map<String, String> headers, Map<String, Object> context}) {
     throw new UnimplementedError();
@@ -119,10 +118,8 @@
     test("supports a Stream<List<int>> body", () {
       var controller = new StreamController();
       var request = _createMessage(body: controller.stream);
-      expect(request.read().toList(), completion(equals([
-        HELLO_BYTES,
-        WORLD_BYTES
-      ])));
+      expect(request.read().toList(),
+          completion(equals([HELLO_BYTES, WORLD_BYTES])));
 
       controller.add(HELLO_BYTES);
       return new Future(() {
@@ -160,9 +157,7 @@
     });
 
     test("comes from the content-length header", () {
-      var request = _createMessage(headers: {
-        'content-length': '42'
-      });
+      var request = _createMessage(headers: {'content-length': '42'});
       expect(request.contentLength, 42);
     });
   });
@@ -173,13 +168,13 @@
     });
 
     test("comes from the content-type header", () {
-      expect(_createMessage(headers: {
-        'content-type': 'text/plain'
-      }).mimeType, equals('text/plain'));
+      expect(_createMessage(headers: {'content-type': 'text/plain'}).mimeType,
+          equals('text/plain'));
     });
 
     test("doesn't include parameters", () {
-      expect(_createMessage(headers: {
+      expect(_createMessage(
+          headers: {
         'content-type': 'text/plain; foo=bar; bar=baz'
       }).mimeType, equals('text/plain'));
     });
@@ -191,19 +186,19 @@
     });
 
     test("is null without a charset parameter", () {
-      expect(_createMessage(headers: {
-        'content-type': 'text/plain'
-      }).encoding, isNull);
+      expect(_createMessage(headers: {'content-type': 'text/plain'}).encoding,
+          isNull);
     });
 
     test("is null with an unrecognized charset parameter", () {
-      expect(_createMessage(headers: {
-        'content-type': 'text/plain; charset=fblthp'
-      }).encoding, isNull);
+      expect(_createMessage(
+              headers: {'content-type': 'text/plain; charset=fblthp'}).encoding,
+          isNull);
     });
 
     test("comes from the content-type charset parameter", () {
-      expect(_createMessage(headers: {
+      expect(_createMessage(
+          headers: {
         'content-type': 'text/plain; charset=iso-8859-1'
       }).encoding, equals(LATIN1));
     });
diff --git a/test/pipeline_test.dart b/test/pipeline_test.dart
index eda4a12..447f037 100644
--- a/test/pipeline_test.dart
+++ b/test/pipeline_test.dart
@@ -71,9 +71,8 @@
       return response;
     });
 
-    var innerPipeline = const Pipeline()
-        .addMiddleware(middlewareA)
-        .addMiddleware(middlewareB);
+    var innerPipeline =
+        const Pipeline().addMiddleware(middlewareA).addMiddleware(middlewareB);
 
     var handler = const Pipeline()
         .addMiddleware(innerPipeline.middleware)
diff --git a/test/request_test.dart b/test/request_test.dart
index fed460f..47b1b7f 100644
--- a/test/request_test.dart
+++ b/test/request_test.dart
@@ -28,8 +28,7 @@
     });
 
     test('requestedUri must be absolute', () {
-      expect(() => new Request('GET', Uri.parse('/path')),
-          throwsArgumentError);
+      expect(() => new Request('GET', Uri.parse('/path')), throwsArgumentError);
     });
 
     test('if uri is null, scriptName must be null', () {
@@ -39,23 +38,21 @@
 
     test('if scriptName is null, uri must be null', () {
       var relativeUri = new Uri(path: '/cool/beans.html');
-      expect(() => new Request('GET', Uri.parse('/path'),
-          url: relativeUri), throwsArgumentError);
+      expect(() => new Request('GET', Uri.parse('/path'), url: relativeUri),
+          throwsArgumentError);
     });
 
     test('uri must be relative', () {
       var relativeUri = Uri.parse('http://localhost/test');
 
       expect(() => new Request('GET', LOCALHOST_URI,
-          url: relativeUri, scriptName: '/news'),
-          throwsArgumentError);
+          url: relativeUri, scriptName: '/news'), throwsArgumentError);
 
       // NOTE: explicitly testing fragments due to Issue 18053
       relativeUri = Uri.parse('http://localhost/test#fragment');
 
       expect(() => new Request('GET', LOCALHOST_URI,
-          url: relativeUri, scriptName: '/news'),
-          throwsArgumentError);
+          url: relativeUri, scriptName: '/news'), throwsArgumentError);
     });
 
     test('uri and scriptName', () {
@@ -88,7 +85,7 @@
       var fullUrl = 'http://localhost$scriptName$testUrl';
 
       expect(() => new Request('GET', Uri.parse(fullUrl),
-          url: Uri.parse(testUrl), scriptName: scriptName),
+              url: Uri.parse(testUrl), scriptName: scriptName),
           throwsArgumentError);
     });
 
@@ -97,16 +94,16 @@
       var scriptName = 'assets/static';
       var fullUrl = 'http://localhost/assets/static/pages';
 
-      expect(() => new Request('GET',Uri.parse(fullUrl),
-          url: Uri.parse(pathInfo), scriptName: scriptName),
+      expect(() => new Request('GET', Uri.parse(fullUrl),
+              url: Uri.parse(pathInfo), scriptName: scriptName),
           throwsArgumentError);
 
       pathInfo = '/assets/static/page';
       scriptName = '/';
       fullUrl = 'http://localhost/assets/static/pages';
 
-      expect(() => new Request('GET',Uri.parse(fullUrl),
-          url: Uri.parse(pathInfo), scriptName: scriptName),
+      expect(() => new Request('GET', Uri.parse(fullUrl),
+              url: Uri.parse(pathInfo), scriptName: scriptName),
           throwsArgumentError);
     });
 
@@ -115,8 +112,8 @@
       var scriptName = '/';
       var fullUrl = 'http://localhost/assets/static/pages';
 
-      expect(() => new Request('GET',Uri.parse(fullUrl),
-          url: Uri.parse(pathInfo), scriptName: scriptName),
+      expect(() => new Request('GET', Uri.parse(fullUrl),
+              url: Uri.parse(pathInfo), scriptName: scriptName),
           throwsArgumentError);
     });
   });
@@ -128,9 +125,8 @@
     });
 
     test("comes from the Last-Modified header", () {
-      var request = _request({
-        'if-modified-since': 'Sun, 06 Nov 1994 08:49:37 GMT'
-      });
+      var request =
+          _request({'if-modified-since': 'Sun, 06 Nov 1994 08:49:37 GMT'});
       expect(request.ifModifiedSince,
           equals(DateTime.parse("1994-11-06 08:49:37z")));
     });
@@ -199,8 +195,8 @@
     test('scriptName and url', () {
       var uri = Uri.parse('https://test.example.com/static/file.html');
       var request = new Request('GET', uri);
-      var copy = request.change(scriptName: '/dynamic',
-          url: Uri.parse('/other_path/file.html'));
+      var copy = request.change(
+          scriptName: '/dynamic', url: Uri.parse('/other_path/file.html'));
 
       expect(copy.scriptName, '/dynamic');
       expect(copy.url, Uri.parse('/other_path/file.html'));
diff --git a/test/response_test.dart b/test/response_test.dart
index 86652c7..71ff58f 100644
--- a/test/response_test.dart
+++ b/test/response_test.dart
@@ -40,8 +40,7 @@
 
     test("adds an explicit encoding to the content-type", () {
       var response = new Response.ok("è",
-          encoding: LATIN1,
-          headers: {'content-type': 'text/plain'});
+          encoding: LATIN1, headers: {'content-type': 'text/plain'});
       expect(response.headers,
           containsPair('content-type', 'text/plain; charset=iso-8859-1'));
     });
@@ -49,8 +48,8 @@
     test("sets an absent content-type to application/octet-stream in order to "
         "set the charset", () {
       var response = new Response.ok("è", encoding: LATIN1);
-      expect(response.headers, containsPair('content-type',
-          'application/octet-stream; charset=iso-8859-1'));
+      expect(response.headers, containsPair(
+          'content-type', 'application/octet-stream; charset=iso-8859-1'));
     });
 
     test("overwrites an existing charset if given an explicit encoding", () {
@@ -65,8 +64,8 @@
   group("new Response.internalServerError without a body", () {
     test('sets the body to "Internal Server Error"', () {
       var response = new Response.internalServerError();
-      expect(response.readAsString(),
-          completion(equals("Internal Server Error")));
+      expect(
+          response.readAsString(), completion(equals("Internal Server Error")));
     });
 
     test('sets the content-type header to text/plain', () {
@@ -75,7 +74,8 @@
     });
 
     test('preserves content-type parameters', () {
-      var response = new Response.internalServerError(headers: {
+      var response = new Response.internalServerError(
+          headers: {
         'content-type': 'application/octet-stream; param=whatever'
       });
       expect(response.headers,
@@ -101,7 +101,8 @@
     });
 
     test("comes from the Expires header", () {
-      expect(new Response.ok("okay!", headers: {
+      expect(new Response.ok("okay!",
+          headers: {
         'expires': 'Sun, 06 Nov 1994 08:49:37 GMT'
       }).expires, equals(DateTime.parse("1994-11-06 08:49:37z")));
     });
@@ -113,7 +114,8 @@
     });
 
     test("comes from the Last-Modified header", () {
-      expect(new Response.ok("okay!", headers: {
+      expect(new Response.ok("okay!",
+          headers: {
         'last-modified': 'Sun, 06 Nov 1994 08:49:37 GMT'
       }).lastModified, equals(DateTime.parse("1994-11-06 08:49:37z")));
     });
@@ -123,7 +125,9 @@
     test('with no arguments returns instance with equal values', () {
       var controller = new StreamController();
 
-      var request = new Response(345, body: 'hèllo, world', encoding: LATIN1,
+      var request = new Response(345,
+          body: 'hèllo, world',
+          encoding: LATIN1,
           headers: {'header1': 'header value 1'},
           context: {'context1': 'context value 1'});
 
diff --git a/test/shelf_io_test.dart b/test/shelf_io_test.dart
index c1b4a41..1a0ad78 100644
--- a/test/shelf_io_test.dart
+++ b/test/shelf_io_test.dart
@@ -94,8 +94,8 @@
       return syncHandler(request);
     });
 
-    return schedule(() => http.get('http://localhost:$_serverPort$path'))
-        .then((response) {
+    return schedule(() => http.get('http://localhost:$_serverPort$path')).then(
+        (response) {
       expect(response.statusCode, HttpStatus.OK);
       expect(response.body, 'Hello from /foo/bar');
     });
@@ -103,10 +103,8 @@
 
   test('custom response headers are received by the client', () {
     _scheduleServer((request) {
-      return new Response.ok('Hello from /', headers: {
-        'test-header': 'test-value',
-        'test-list': 'a, b, c'
-      });
+      return new Response.ok('Hello from /',
+          headers: {'test-header': 'test-value', 'test-list': 'a, b, c'});
     });
 
     return _scheduleGet().then((response) {
@@ -193,8 +191,7 @@
       request.hijack(expectAsync((stream, sink) {
         expect(stream.first, completion(equals("Hello".codeUnits)));
 
-        sink.add((
-            "HTTP/1.1 404 Not Found\r\n"
+        sink.add(("HTTP/1.1 404 Not Found\r\n"
             "Date: Mon, 23 May 2005 22:38:34 GMT\r\n"
             "Content-Length: 13\r\n"
             "\r\n"
@@ -206,8 +203,8 @@
     return _schedulePost(body: "Hello").then((response) {
       expect(response.statusCode, HttpStatus.NOT_FOUND);
       expect(response.headers["date"], "Mon, 23 May 2005 22:38:34 GMT");
-      expect(response.stream.bytesToString(),
-          completion(equals("Hello, world!")));
+      expect(
+          response.stream.bytesToString(), completion(equals("Hello, world!")));
     });
   });
 
@@ -301,9 +298,8 @@
     test('defers to header in response', () {
       var date = new DateTime.utc(1981, 6, 5);
       _scheduleServer((request) {
-        return new Response.ok('test', headers: {
-          HttpHeaders.DATE: parser.formatHttpDate(date)
-        });
+        return new Response.ok('test',
+            headers: {HttpHeaders.DATE: parser.formatHttpDate(date)});
       });
 
       return _scheduleGet().then((response) {
@@ -353,17 +349,15 @@
 Future<http.Response> _scheduleGet({Map<String, String> headers}) {
   if (headers == null) headers = {};
 
-  return schedule(() =>
-      http.get('http://localhost:$_serverPort/', headers: headers));
+  return schedule(
+      () => http.get('http://localhost:$_serverPort/', headers: headers));
 }
 
-Future<http.StreamedResponse> _schedulePost({Map<String, String> headers,
-    String body}) {
-
+Future<http.StreamedResponse> _schedulePost(
+    {Map<String, String> headers, String body}) {
   return schedule(() {
-
-    var request = new http.Request('POST',
-        Uri.parse('http://localhost:$_serverPort/'));
+    var request =
+        new http.Request('POST', Uri.parse('http://localhost:$_serverPort/'));
 
     if (headers != null) request.headers.addAll(headers);
     if (body != null) request.body = body;
diff --git a/test/test_util.dart b/test/test_util.dart
index 281989b..193e322 100644
--- a/test/test_util.dart
+++ b/test/test_util.dart
@@ -19,11 +19,11 @@
 ///
 /// By default, replies with a status code 200, empty headers, and
 /// `Hello from ${request.url.path}`.
-Response syncHandler(Request request, {int statusCode,
-    Map<String, String> headers}) {
+Response syncHandler(Request request,
+    {int statusCode, Map<String, String> headers}) {
   if (statusCode == null) statusCode = 200;
-  return new Response(statusCode, headers: headers,
-      body: 'Hello from ${request.url.path}');
+  return new Response(statusCode,
+      headers: headers, body: 'Hello from ${request.url.path}');
 }
 
 /// Calls [syncHandler] and wraps the response in a [Future].
