diff --git a/.analysis_options b/.analysis_options
new file mode 100644
index 0000000..a10d4c5
--- /dev/null
+++ b/.analysis_options
@@ -0,0 +1,2 @@
+analyzer:
+  strong-mode: true
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1db0a15..198b1b6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 2.0.1
+
+* Fix most strong mode errors and warnings.
+
 ## 2.0.0
 
 * **Breaking:** Change the signature of `HttpMultiServer.loopbackSecure()` to
diff --git a/lib/http_multi_server.dart b/lib/http_multi_server.dart
index 6c4e468..18d42cf 100644
--- a/lib/http_multi_server.dart
+++ b/lib/http_multi_server.dart
@@ -5,6 +5,8 @@
 import 'dart:async';
 import 'dart:io';
 
+import 'package:async/async.dart';
+
 import 'src/multi_headers.dart';
 import 'src/utils.dart';
 
@@ -86,7 +88,7 @@
       : _servers = servers.toSet(),
         defaultResponseHeaders = new MultiHeaders(
             servers.map((server) => server.defaultResponseHeaders)),
-        super(mergeStreams(servers));
+        super(StreamGroup.merge(servers));
 
   /// Creates an [HttpServer] listening on all available loopback addresses for
   /// this computer.
@@ -121,36 +123,28 @@
   /// [HttpServer.bindSecure].
   static Future<HttpServer> _loopback(int port,
       Future<HttpServer> bind(InternetAddress address, int port),
-      [int remainingRetries]) {
+      [int remainingRetries]) async {
     if (remainingRetries == null) remainingRetries = 5;
 
-    return Future.wait([
-      supportsIpV6,
-      bind(InternetAddress.LOOPBACK_IP_V4, port)
-    ]).then((results) {
-      var supportsIpV6 = results[0];
-      var v4Server = results[1];
+    var v4Server = await bind(InternetAddress.LOOPBACK_IP_V4, port);
+    if (!await supportsIpV6) return v4Server;
 
-      if (!supportsIpV6) return v4Server;
-
+    try {
       // Reuse the IPv4 server's port so that if [port] is 0, both servers use
       // the same ephemeral port.
-      return bind(InternetAddress.LOOPBACK_IP_V6, v4Server.port)
-          .then((v6Server) {
-        return new HttpMultiServer([v4Server, v6Server]);
-      }).catchError((error) {
-        if (error is! SocketException) throw error;
-        if (error.osError.errorCode != _addressInUseErrno) throw error;
-        if (port != 0) throw error;
-        if (remainingRetries == 0) throw error;
+      var v6Server = await bind(InternetAddress.LOOPBACK_IP_V6, v4Server.port);
+      return new HttpMultiServer([v4Server, v6Server]);
+    } on SocketException catch (error) {
+      if (error.osError.errorCode != _addressInUseErrno) rethrow;
+      if (port != 0) rethrow;
+      if (remainingRetries == 0) rethrow;
 
-        // A port being available on IPv4 doesn't necessarily mean that the same
-        // port is available on IPv6. If it's not (which is rare in practice),
-        // we try again until we find one that's available on both.
-        v4Server.close();
-        return _loopback(port, bind, remainingRetries - 1);
-      });
-    });
+      // A port being available on IPv4 doesn't necessarily mean that the same
+      // port is available on IPv6. If it's not (which is rare in practice),
+      // we try again until we find one that's available on both.
+      v4Server.close();
+      return await _loopback(port, bind, remainingRetries - 1);
+    }
   }
 
   Future close({bool force: false}) =>
diff --git a/lib/src/utils.dart b/lib/src/utils.dart
index ceb5c82..19188cb 100644
--- a/lib/src/utils.dart
+++ b/lib/src/utils.dart
@@ -5,56 +5,20 @@
 import 'dart:async';
 import 'dart:io';
 
-/// Merges all streams in [streams] into a single stream that emits all of their
-/// values.
-///
-/// The returned stream will be closed only when every stream in [streams] is
-/// closed.
-Stream mergeStreams(Iterable<Stream> streams) {
-  var subscriptions = new Set();
-  var controller;
-  controller = new StreamController(onListen: () {
-    for (var stream in streams) {
-      var subscription;
-      subscription = stream.listen(controller.add,
-          onError: controller.addError,
-          onDone: () {
-        subscriptions.remove(subscription);
-        if (subscriptions.isEmpty) controller.close();
-      });
-      subscriptions.add(subscription);
-    }
-  }, onCancel: () {
-    for (var subscription in subscriptions) {
-      subscription.cancel();
-    }
-  }, onPause: () {
-    for (var subscription in subscriptions) {
-      subscription.pause();
-    }
-  }, onResume: () {
-    for (var subscription in subscriptions) {
-      subscription.resume();
-    }
-  }, sync: true);
-
-  return controller.stream;
-}
-
 /// A cache for [supportsIpV6].
 bool _supportsIpV6;
 
 /// Returns whether this computer supports binding to IPv6 addresses.
-Future<bool> get supportsIpV6 {
-  if (_supportsIpV6 != null) return new Future.value(_supportsIpV6);
+Future<bool> get supportsIpV6 async {
+  if (_supportsIpV6 != null) return _supportsIpV6;
 
-  return ServerSocket.bind(InternetAddress.LOOPBACK_IP_V6, 0).then((socket) {
+  try {
+    var socket = await ServerSocket.bind(InternetAddress.LOOPBACK_IP_V6, 0);
     _supportsIpV6 = true;
     socket.close();
     return true;
-  }).catchError((error) {
-    if (error is! SocketException) throw error;
+  } on SocketException catch (_) {
     _supportsIpV6 = false;
     return false;
-  });
+  }
 }
diff --git a/pubspec.yaml b/pubspec.yaml
index 44daa8f..647b7eb 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,10 +1,11 @@
 name: http_multi_server
-version: 2.0.0
+version: 2.0.1
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://github.com/dart-lang/http_multi_server
 description:
   A dart:io HttpServer wrapper that handles requests from multiple servers.
 dev_dependencies:
+  async: "^1.2.0"
   test: ">=0.12.0 <0.13.0"
   http: ">=0.11.0 <0.12.0"
 environment:
