diff --git a/lib/src/bound_multipart_stream.dart b/lib/src/bound_multipart_stream.dart
index 4b32ef9..07418b2 100644
--- a/lib/src/bound_multipart_stream.dart
+++ b/lib/src/bound_multipart_stream.dart
@@ -45,24 +45,26 @@
 
 void _expectByteValue(int val1, int val2) {
   if (val1 != val2) {
-    throw MimeMultipartException("Failed to parse multipart mime 1");
+    throw MimeMultipartException('Failed to parse multipart mime 1');
   }
 }
 
 void _expectWhitespace(int byte) {
   if (byte != CharCode.SP && byte != CharCode.HT) {
-    throw MimeMultipartException("Failed to parse multipart mime 2");
+    throw MimeMultipartException('Failed to parse multipart mime 2');
   }
 }
 
 class _MimeMultipart extends MimeMultipart {
+  @override
   final Map<String, String> headers;
   final Stream<List<int>> _stream;
 
   _MimeMultipart(this.headers, this._stream);
 
-  StreamSubscription<List<int>> listen(void onData(List<int> data),
-      {void onDone(), Function onError, bool cancelOnError}) {
+  @override
+  StreamSubscription<List<int>> listen(void Function(List<int> data) onData,
+      {void Function() onDone, Function onError, bool cancelOnError}) {
     return _stream.listen(onData,
         onDone: onDone, onError: onError, cancelOnError: cancelOnError);
   }
@@ -137,7 +139,7 @@
           }, onDone: () {
             if (_state != _DONE) {
               _controller
-                  .addError(MimeMultipartException("Bad multipart ending"));
+                  .addError(MimeMultipartException('Bad multipart ending'));
             }
             _controller.close();
           }, onError: _controller.addError);
@@ -168,14 +170,14 @@
           _subscription.cancel();
           break;
         default:
-          throw StateError("This code should never be reached.");
+          throw StateError('This code should never be reached.');
       }
     }
   }
 
   void _parse() {
     // Number of boundary bytes to artificially place before the supplied data.
-    int boundaryPrefix = 0;
+    var boundaryPrefix = 0;
     // Position where content starts. Will be null if no known content
     // start exists. Will be negative of the content starts in the
     // boundary prefix. Will be zero or position if the content starts
@@ -209,7 +211,7 @@
     } else {
       contentStartIndex = null;
     }
-    // The data to parse might be "artificially" prefixed with a
+    // The data to parse might be 'artificially' prefixed with a
     // partial match of the boundary.
     boundaryPrefix = _boundaryIndex;
 
@@ -256,7 +258,7 @@
           break;
 
         case _HEADER_START:
-          _headers = Map<String, String>();
+          _headers = <String, String>{};
           if (byte == CharCode.CR) {
             _state = _HEADER_ENDING;
           } else {
@@ -271,7 +273,7 @@
             _state = _HEADER_VALUE_START;
           } else {
             if (!_isTokenChar(byte)) {
-              throw MimeMultipartException("Invalid header field name");
+              throw MimeMultipartException('Invalid header field name');
             }
             _headerField.add(_toLowerCase(byte));
           }
@@ -304,8 +306,8 @@
           if (byte == CharCode.SP || byte == CharCode.HT) {
             _state = _HEADER_VALUE_START;
           } else {
-            String headerField = utf8.decode(_headerField);
-            String headerValue = utf8.decode(_headerValue);
+            var headerField = utf8.decode(_headerField);
+            var headerValue = utf8.decode(_headerValue);
             _headers[headerField.toLowerCase()] = headerValue;
             _headerField.clear();
             _headerValue.clear();
@@ -353,7 +355,7 @@
           } else {
             // Restart matching of the boundary.
             _index = _index - _boundaryIndex;
-            if (contentStartIndex == null) contentStartIndex = _index;
+            contentStartIndex ??= _index;
             _boundaryIndex = 0;
           }
           break;
diff --git a/lib/src/magic_number.dart b/lib/src/magic_number.dart
index d490346..50be18a 100644
--- a/lib/src/magic_number.dart
+++ b/lib/src/magic_number.dart
@@ -14,7 +14,7 @@
   bool matches(List<int> header) {
     if (header.length < numbers.length) return false;
 
-    for (int i = 0; i < numbers.length; i++) {
+    for (var i = 0; i < numbers.length; i++) {
       if (mask != null) {
         if ((mask[i] & numbers[i]) != (mask[i] & header[i])) return false;
       } else {
diff --git a/lib/src/mime_multipart_transformer.dart b/lib/src/mime_multipart_transformer.dart
index 5509339..1869480 100644
--- a/lib/src/mime_multipart_transformer.dart
+++ b/lib/src/mime_multipart_transformer.dart
@@ -37,6 +37,7 @@
   MimeMultipartTransformer(String boundary)
       : _boundary = _getBoundary(boundary);
 
+  @override
   Stream<MimeMultipart> bind(Stream<List<int>> stream) {
     return BoundMultipartStream(_boundary, stream).stream;
   }
diff --git a/lib/src/mime_shared.dart b/lib/src/mime_shared.dart
index 5cc6a8f..00ade1d 100644
--- a/lib/src/mime_shared.dart
+++ b/lib/src/mime_shared.dart
@@ -8,9 +8,10 @@
 class MimeMultipartException implements Exception {
   final String message;
 
-  const MimeMultipartException([this.message = ""]);
+  const MimeMultipartException([this.message = '']);
 
-  String toString() => "MimeMultipartException: $message";
+  @override
+  String toString() => 'MimeMultipartException: $message';
 }
 
 /// A Mime Multipart class representing each part parsed by
diff --git a/lib/src/mime_type.dart b/lib/src/mime_type.dart
index 6fbe270..84ac306 100644
--- a/lib/src/mime_type.dart
+++ b/lib/src/mime_type.dart
@@ -104,7 +104,7 @@
   }
 
   static String _ext(String path) {
-    int index = path.lastIndexOf('.');
+    var index = path.lastIndexOf('.');
     if (index < 0 || index + 1 >= path.length) return path;
     return path.substring(index + 1).toLowerCase();
   }
diff --git a/pubspec.yaml b/pubspec.yaml
index e4038a7..b0c21b3 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,10 +1,9 @@
 name: mime
-version: 0.9.6+3
+version: 0.9.7-dev
 
 description: >-
   Utilities for handling media (MIME) types, including determining a type from
   a file extension and file contents.
-author: Dart Team <misc@dartlang.org>
 homepage: https://www.github.com/dart-lang/mime
 
 environment:
diff --git a/test/mime_multipart_transformer_test.dart b/test/mime_multipart_transformer_test.dart
index be8ca17..fbfe2b6 100644
--- a/test/mime_multipart_transformer_test.dart
+++ b/test/mime_multipart_transformer_test.dart
@@ -5,16 +5,16 @@
 import 'dart:async';
 import 'dart:math';
 
-import "package:test/test.dart";
-import "package:mime/mime.dart";
+import 'package:test/test.dart';
+import 'package:mime/mime.dart';
 
 void _writeInChunks(
     List<int> data, int chunkSize, StreamController<List<int>> controller) {
   if (chunkSize == -1) chunkSize = data.length;
 
-  for (int pos = 0; pos < data.length; pos += chunkSize) {
-    int remaining = data.length - pos;
-    int writeLength = min(chunkSize, remaining);
+  for (var pos = 0; pos < data.length; pos += chunkSize) {
+    var remaining = data.length - pos;
+    var writeLength = min(chunkSize, remaining);
     controller.add(data.sublist(pos, pos + writeLength));
   }
   controller.close();
@@ -29,11 +29,11 @@
 
     var stream =
         controller.stream.transform(MimeMultipartTransformer(boundary));
-    int i = 0;
+    var i = 0;
     var completer = Completer();
     var futures = <Future>[];
     stream.listen((multipart) {
-      int part = i++;
+      var part = i++;
       if (expectedHeaders != null) {
         expect(multipart.headers, equals(expectedHeaders[part]));
       }
@@ -121,10 +121,10 @@
     var stream =
         controller.stream.transform(MimeMultipartTransformer(boundary));
     var subscription;
-    int i = 0;
+    var i = 0;
     var futures = <Future>[];
     subscription = stream.listen((multipart) {
-      int partIndex = i;
+      var partIndex = i;
 
       if (partIndex >= parts) {
         throw StateError('Expected no more parts, but got one.');
@@ -153,7 +153,7 @@
 
   // Test parsing the data three times delivering the data in
   // different chunks.
-  List<int> data = message.codeUnits;
+  var data = message.codeUnits;
   test('test', () {
     expect(
         Future.wait([
@@ -178,7 +178,7 @@
     });
 
     test('test-n-parts-only', () {
-      int numPartsExpected = expectedParts.length - 1;
+      var numPartsExpected = expectedParts.length - 1;
       if (numPartsExpected == 0) numPartsExpected = 1;
 
       expect(
@@ -206,10 +206,10 @@
 void _testParseValid() {
   // Empty message from Chrome form post.
   var message = '------WebKitFormBoundaryU3FBruSkJKG0Yor1--\r\n';
-  _testParse(message, "----WebKitFormBoundaryU3FBruSkJKG0Yor1", [], []);
+  _testParse(message, '----WebKitFormBoundaryU3FBruSkJKG0Yor1', [], []);
 
   // Sample from Wikipedia.
-  message = """
+  message = '''
 This is a message with multiple parts in MIME format.\r
 --frontier\r
 Content-Type: text/plain\r
@@ -221,20 +221,20 @@
 \r
 PGh0bWw+CiAgPGhlYWQ+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPHA+VGhpcyBpcyB0aGUg
 Ym9keSBvZiB0aGUgbWVzc2FnZS48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg=\r
---frontier--\r\n""";
-  var headers1 = <String, String>{"content-type": "text/plain"};
+--frontier--\r\n''';
+  var headers1 = <String, String>{'content-type': 'text/plain'};
   var headers2 = <String, String>{
-    "content-type": "application/octet-stream",
-    "content-transfer-encoding": "base64"
+    'content-type': 'application/octet-stream',
+    'content-transfer-encoding': 'base64'
   };
-  var body1 = "This is the body of the message.";
-  var body2 = """
+  var body1 = 'This is the body of the message.';
+  var body2 = '''
 PGh0bWw+CiAgPGhlYWQ+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPHA+VGhpcyBpcyB0aGUg
-Ym9keSBvZiB0aGUgbWVzc2FnZS48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg=""";
-  _testParse(message, "frontier", [headers1, headers2], [body1, body2]);
+Ym9keSBvZiB0aGUgbWVzc2FnZS48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg=''';
+  _testParse(message, 'frontier', [headers1, headers2], [body1, body2]);
 
   // Sample from HTML 4.01 Specification.
-  message = """
+  message = '''
 \r\n--AaB03x\r
 Content-Disposition: form-data; name=\"submit-name\"\r
 \r
@@ -244,17 +244,17 @@
 Content-Type: text/plain\r
 \r
 ... contents of file1.txt ...\r
---AaB03x--\r\n""";
+--AaB03x--\r\n''';
   headers1 = <String, String>{
-    "content-disposition": "form-data; name=\"submit-name\""
+    'content-disposition': 'form-data; name=\"submit-name\"'
   };
   headers2 = <String, String>{
-    "content-type": "text/plain",
-    "content-disposition": "form-data; name=\"files\"; filename=\"file1.txt\""
+    'content-type': 'text/plain',
+    'content-disposition': 'form-data; name=\"files\"; filename=\"file1.txt\"'
   };
-  body1 = "Larry";
-  body2 = "... contents of file1.txt ...";
-  _testParse(message, "AaB03x", [headers1, headers2], [body1, body2]);
+  body1 = 'Larry';
+  body2 = '... contents of file1.txt ...';
+  _testParse(message, 'AaB03x', [headers1, headers2], [body1, body2]);
 
   // Longer form from submitting the following from Chrome.
   //
@@ -262,19 +262,19 @@
   // <body>
   // <FORM action="http://127.0.0.1:1234/"
   //     enctype="multipart/form-data"
-  //     method="post">
+  //     method='post'>
   //  <P>
-  //  Text: <INPUT type="text" name="text_input">
-  //  Password: <INPUT type="password" name="password_input">
-  //  Checkbox: <INPUT type="checkbox" name="checkbox_input">
-  //  Radio: <INPUT type="radio" name="radio_input">
-  //  Send <INPUT type="submit">
+  //  Text: <INPUT type='text' name='text_input'>
+  //  Password: <INPUT type='password' name='password_input'>
+  //  Checkbox: <INPUT type='checkbox' name='checkbox_input'>
+  //  Radio: <INPUT type='radio' name='radio_input'>
+  //  Send <INPUT type='submit'>
   //  </P>
   // </FORM>
   // </body>
   // </html>
 
-  message = """
+  message = '''
 \r\n------WebKitFormBoundaryQ3cgYAmGRF8yOeYB\r
 Content-Disposition: form-data; name=\"text_input\"\r
 \r
@@ -291,28 +291,28 @@
 Content-Disposition: form-data; name=\"radio_input\"\r
 \r
 on\r
-------WebKitFormBoundaryQ3cgYAmGRF8yOeYB--\r\n""";
+------WebKitFormBoundaryQ3cgYAmGRF8yOeYB--\r\n''';
   headers1 = <String, String>{
-    "content-disposition": "form-data; name=\"text_input\""
+    'content-disposition': 'form-data; name=\"text_input\"'
   };
   headers2 = <String, String>{
-    "content-disposition": "form-data; name=\"password_input\""
+    'content-disposition': 'form-data; name=\"password_input\"'
   };
   var headers3 = <String, String>{
-    "content-disposition": "form-data; name=\"checkbox_input\""
+    'content-disposition': 'form-data; name=\"checkbox_input\"'
   };
   var headers4 = <String, String>{
-    "content-disposition": "form-data; name=\"radio_input\""
+    'content-disposition': 'form-data; name=\"radio_input\"'
   };
-  body1 = "text";
-  body2 = "password";
-  var body3 = "on";
-  var body4 = "on";
-  _testParse(message, "----WebKitFormBoundaryQ3cgYAmGRF8yOeYB",
+  body1 = 'text';
+  body2 = 'password';
+  var body3 = 'on';
+  var body4 = 'on';
+  _testParse(message, '----WebKitFormBoundaryQ3cgYAmGRF8yOeYB',
       [headers1, headers2, headers3, headers4], [body1, body2, body3, body4]);
 
   // Same form from Firefox.
-  message = """
+  message = '''
 \r\n-----------------------------52284550912143824192005403738\r
 Content-Disposition: form-data; name=\"text_input\"\r
 \r
@@ -329,15 +329,15 @@
 Content-Disposition: form-data; name=\"radio_input\"\r
 \r
 on\r
------------------------------52284550912143824192005403738--\r\n""";
+-----------------------------52284550912143824192005403738--\r\n''';
   _testParse(
       message,
-      "---------------------------52284550912143824192005403738",
+      '---------------------------52284550912143824192005403738',
       [headers1, headers2, headers3, headers4],
       [body1, body2, body3, body4]);
 
   // And Internet Explorer
-  message = """
+  message = '''
 \r\n-----------------------------7dc8f38c60326\r
 Content-Disposition: form-data; name=\"text_input\"\r
 \r
@@ -354,12 +354,12 @@
 Content-Disposition: form-data; name=\"radio_input\"\r
 \r
 on\r
------------------------------7dc8f38c60326--\r\n""";
-  _testParse(message, "---------------------------7dc8f38c60326",
+-----------------------------7dc8f38c60326--\r\n''';
+  _testParse(message, '---------------------------7dc8f38c60326',
       [headers1, headers2, headers3, headers4], [body1, body2, body3, body4]);
 
   // Test boundary prefix inside prefix and content.
-  message = """
+  message = '''
 -\r
 --\r
 --b\r
@@ -393,9 +393,9 @@
 --b\r\r\r\r
 --\r\r\r
 -\r\r
---boundary--\r\n""";
-  var headers = <String, String>{"content-type": "text/plain"};
-  body1 = """
+--boundary--\r\n''';
+  var headers = <String, String>{'content-type': 'text/plain'};
+  body1 = '''
 -\r
 --\r
 --b\r
@@ -404,8 +404,8 @@
 --boun\r
 --bound\r\r
 --bounda\r\r\r
---boundar\r\r\r""";
-  body2 = """
+--boundar\r\r\r''';
+  body2 = '''
 --boundar\r
 --bounda\r
 --bound\r
@@ -414,11 +414,11 @@
 --bo\r
 --b\r\r\r\r
 --\r\r\r
--\r""";
-  _testParse(message, "boundary", [headers, headers], [body1, body2]);
+-\r''';
+  _testParse(message, 'boundary', [headers, headers], [body1, body2]);
 
   // Without initial CRLF.
-  message = """
+  message = '''
 --xxx\r
 \r
 \r
@@ -427,13 +427,13 @@
 \r
 \r
 Body2\r
---xxx--\r\n""";
-  _testParse(message, "xxx", null, ["\r\nBody 1", "\r\nBody2"]);
+--xxx--\r\n''';
+  _testParse(message, 'xxx', null, ['\r\nBody 1', '\r\nBody2']);
 }
 
 void _testParseInvalid() {
   // Missing end boundary.
-  var message = """
+  var message = '''
 \r
 --xxx\r
 \r
@@ -443,8 +443,8 @@
 \r
 \r
 Body2\r
---xxx\r\n""";
-  _testParse(message, "xxx", null, [null, null], true);
+--xxx\r\n''';
+  _testParse(message, 'xxx', null, [null, null], true);
 }
 
 void main() {
