diff --git a/lib/src/http_impl.dart b/lib/src/http_impl.dart
index d0de8b0..e533e3e 100644
--- a/lib/src/http_impl.dart
+++ b/lib/src/http_impl.dart
@@ -308,7 +308,7 @@
     Stream<List<int>> stream = _incoming;
     if (_httpClient.autoUncompress &&
         headers.value(HttpHeaders.CONTENT_ENCODING) == "gzip") {
-      stream = stream.transform(gzip.decoder);
+      stream = gzip.decoder.bind(stream);
     }
     return stream.listen(onData,
         onError: onError, onDone: onDone, cancelOnError: cancelOnError);
@@ -2696,13 +2696,13 @@
   }
 }
 
-class _DetachedSocket extends Stream<List<int>> implements Socket {
-  final Stream<List<int>> _incoming;
+class _DetachedSocket extends Stream<Uint8List> implements Socket {
+  final Stream<Uint8List> _incoming;
   final Socket _socket;
 
   _DetachedSocket(this._socket, this._incoming);
 
-  StreamSubscription<List<int>> listen(void onData(List<int> event),
+  StreamSubscription<Uint8List> listen(void onData(Uint8List event),
       {Function onError, void onDone(), bool cancelOnError}) {
     return _incoming.listen(onData,
         onError: onError, onDone: onDone, cancelOnError: cancelOnError);
@@ -2738,7 +2738,7 @@
       _socket.addError(error, stackTrace);
 
   Future addStream(Stream<List<int>> stream) {
-    return _socket.addStream(stream);
+    return _socket.addStream(stream.cast<List<int>>());
   }
 
   void destroy() {
diff --git a/lib/src/http_parser.dart b/lib/src/http_parser.dart
index 5b228c8..a16ca47 100644
--- a/lib/src/http_parser.dart
+++ b/lib/src/http_parser.dart
@@ -69,9 +69,9 @@
  * _HttpDetachedStreamSubscription is resumed, it'll deliver the data before
  * resuming the underlaying subscription.
  */
-class _HttpDetachedStreamSubscription implements StreamSubscription<List<int>> {
-  StreamSubscription<List<int>> _subscription;
-  List<int> _injectData;
+class _HttpDetachedStreamSubscription implements StreamSubscription<Uint8List> {
+  StreamSubscription<Uint8List> _subscription;
+  Uint8List _injectData;
   bool _isCanceled = false;
   int _pauseCount = 1;
   Function _userOnData;
@@ -91,7 +91,7 @@
     return _subscription.cancel();
   }
 
-  void onData(void handleData(List<int> data)) {
+  void onData(void handleData(Uint8List data)) {
     _userOnData = handleData;
     _subscription.onData(handleData);
   }
@@ -143,13 +143,13 @@
   }
 }
 
-class HttpDetachedIncoming extends Stream<List<int>> {
-  final StreamSubscription<List<int>> subscription;
-  final List<int> bufferedData;
+class HttpDetachedIncoming extends Stream<Uint8List> {
+  final StreamSubscription<Uint8List> subscription;
+  final Uint8List bufferedData;
 
   HttpDetachedIncoming(this.subscription, this.bufferedData);
 
-  StreamSubscription<List<int>> listen(void onData(List<int> event),
+  StreamSubscription<Uint8List> listen(void onData(Uint8List event),
       {Function onError, void onDone(), bool cancelOnError}) {
     if (subscription != null) {
       subscription
@@ -164,7 +164,7 @@
         ..resume();
     } else {
       // TODO(26379): add test for this branch.
-      return new Stream<List<int>>.fromIterable([bufferedData]).listen(onData,
+      return new Stream<Uint8List>.fromIterable([bufferedData]).listen(onData,
           onError: onError, onDone: onDone, cancelOnError: cancelOnError);
     }
   }
@@ -222,11 +222,11 @@
 
   // The current incoming connection.
   HttpIncoming _incoming;
-  StreamSubscription<List<int>> _socketSubscription;
+  StreamSubscription<Uint8List> _socketSubscription;
   bool _paused = true;
   bool _bodyPaused = false;
   StreamController<HttpIncoming> _controller;
-  StreamController<List<int>> _bodyController;
+  StreamController<Uint8List> _bodyController;
 
   factory HttpParser.requestParser() {
     return new HttpParser._(true);
@@ -264,7 +264,7 @@
         onError: onError, onDone: onDone, cancelOnError: cancelOnError);
   }
 
-  void listenToStream(Stream<List<int>> stream) {
+  void listenToStream(Stream<Uint8List> stream) {
     // Listen to the stream and handle data accordingly. When a
     // _HttpIncoming is created, _dataPause, _dataResume, _dataDone is
     // given to provide a way of controlling the parser.
@@ -725,7 +725,7 @@
           // Always present the data as a view. This way we can handle all
           // cases like this, and the user will not experience different data
           // typed (which could lead to polymorphic user code).
-          List<int> data = new Uint8List.view(
+          Uint8List data = new Uint8List.view(
               _buffer.buffer, _buffer.offsetInBytes + _index, dataAvailable);
           _bodyController.add(data);
           if (_remainingContent != -1) {
@@ -765,7 +765,7 @@
     }
   }
 
-  void _onData(List<int> buffer) {
+  void _onData(Uint8List buffer) {
     _socketSubscription.pause();
     assert(_buffer == null);
     _buffer = buffer;
@@ -851,7 +851,7 @@
     return new HttpDetachedIncoming(_socketSubscription, readUnparsedData());
   }
 
-  List<int> readUnparsedData() {
+  Uint8List readUnparsedData() {
     if (_buffer == null) return null;
     if (_index == _buffer.length) return null;
     var result = _buffer.sublist(_index);
@@ -946,7 +946,7 @@
     assert(_bodyController == null);
     assert(!_bodyPaused);
     HttpIncoming incoming;
-    _bodyController = new StreamController<List<int>>(
+    _bodyController = new StreamController<Uint8List>(
         sync: true,
         onListen: () {
           if (incoming != _incoming) return;
diff --git a/pubspec.yaml b/pubspec.yaml
index ce172f1..997dacb 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -4,7 +4,7 @@
 description: HTTP Client and Server APIs.
 
 environment:
-  sdk: ">=2.2.0 <3.0.0"
+  sdk: ">=2.5.0-dev.0.0 <3.0.0"
 
 dev_dependencies:
   convert: ^2.0.1
diff --git a/test/http_detach_socket_test.dart b/test/http_detach_socket_test.dart
index c0b645d..4c924d2 100644
--- a/test/http_detach_socket_test.dart
+++ b/test/http_detach_socket_test.dart
@@ -158,7 +158,7 @@
       request.response.headers.set('connection', 'upgrade');
       if (request.headers.value('upgrade') == 'mine') {
         request.response.detachSocket().then((socket) {
-          socket.pipe(socket).then((_) {});
+          socket.cast<List<int>>().pipe(socket).then((_) {});
         });
       } else {
         request.response.close();
diff --git a/test/http_parser_test.dart b/test/http_parser_test.dart
index 33b2160..d25e04f 100644
--- a/test/http_parser_test.dart
+++ b/test/http_parser_test.dart
@@ -31,7 +31,7 @@
       int unparsedLength: 0,
       bool connectionClose: false,
       String expectedVersion: "1.1"}) {
-    StreamController<List<int>> controller;
+    StreamController<Uint8List> controller;
     void reset() {
       HttpParser httpParser = new HttpParser.requestParser();
       controller = new StreamController(sync: true);
@@ -101,7 +101,7 @@
       upgraded = false;
     }
 
-    void testWrite(List<int> requestData, [int chunkSize = -1]) {
+    void testWrite(Uint8List requestData, [int chunkSize = -1]) {
       if (chunkSize == -1) chunkSize = requestData.length;
       reset();
       for (int pos = 0; pos < requestData.length; pos += chunkSize) {
@@ -113,7 +113,7 @@
 
     // Test parsing the request three times delivering the data in
     // different chunks.
-    List<int> requestData = new Uint8List.fromList(request.codeUnits);
+    Uint8List requestData = new Uint8List.fromList(request.codeUnits);
     testWrite(requestData);
     testWrite(requestData, 10);
     testWrite(requestData, 1);
@@ -153,7 +153,7 @@
   static void _testParseInvalidRequest(String request) {
     HttpParser httpParser;
     bool errorCalled;
-    StreamController<List<int>> controller;
+    StreamController<Uint8List> controller;
 
     void reset() {
       httpParser = new HttpParser.requestParser();
@@ -173,7 +173,7 @@
       errorCalled = false;
     }
 
-    void testWrite(List<int> requestData, [int chunkSize = -1]) {
+    void testWrite(Uint8List requestData, [int chunkSize = -1]) {
       if (chunkSize == -1) chunkSize = requestData.length;
       reset();
       for (int pos = 0;
@@ -187,7 +187,7 @@
 
     // Test parsing the request three times delivering the data in
     // different chunks.
-    List<int> requestData = new Uint8List.fromList(request.codeUnits);
+    Uint8List requestData = new Uint8List.fromList(request.codeUnits);
     testWrite(requestData);
     testWrite(requestData, 10);
     testWrite(requestData, 1);
@@ -205,7 +205,7 @@
       bool upgrade: false,
       int unparsedLength: 0,
       String expectedVersion: "1.1"}) {
-    StreamController<List<int>> controller;
+    StreamController<Uint8List> controller;
 
     void reset() {
       HttpParser httpParser;
@@ -275,7 +275,7 @@
       bytesReceived = 0;
     }
 
-    void testWrite(List<int> requestData, [int chunkSize = -1]) {
+    void testWrite(Uint8List requestData, [int chunkSize = -1]) {
       if (chunkSize == -1) chunkSize = requestData.length;
       reset();
       for (int pos = 0; pos < requestData.length; pos += chunkSize) {
@@ -287,16 +287,16 @@
 
     // Test parsing the request three times delivering the data in
     // different chunks.
-    List<int> responseData = new Uint8List.fromList(response.codeUnits);
+    Uint8List responseData = new Uint8List.fromList(response.codeUnits);
     testWrite(responseData);
     testWrite(responseData, 10);
     testWrite(responseData, 1);
   }
 
   static void _testParseInvalidResponse(String response, [bool close = false]) {
-    void testWrite(List<int> requestData, [int chunkSize = -1]) {
+    void testWrite(Uint8List requestData, [int chunkSize = -1]) {
       HttpParser httpParser = new HttpParser.responseParser();
-      StreamController<List<int>> controller = new StreamController(sync: true);
+      StreamController<Uint8List> controller = new StreamController(sync: true);
       bool errorCalled = false;
 
       if (chunkSize == -1) chunkSize = requestData.length;
@@ -330,7 +330,7 @@
 
     // Test parsing the request three times delivering the data in
     // different chunks.
-    List<int> responseData = new Uint8List.fromList(response.codeUnits);
+    Uint8List responseData = new Uint8List.fromList(response.codeUnits);
     testWrite(responseData);
     testWrite(responseData, 10);
     testWrite(responseData, 1);
diff --git a/test/http_proxy_advanced_test.dart b/test/http_proxy_advanced_test.dart
index 21c90e0..b60ec83 100644
--- a/test/http_proxy_advanced_test.dart
+++ b/test/http_proxy_advanced_test.dart
@@ -237,8 +237,8 @@
           Socket.connect(tmp[0], int.parse(tmp[1])).then((socket) {
             request.response.reasonPhrase = "Connection established";
             request.response.detachSocket().then((detached) {
-              socket.pipe(detached);
-              detached.pipe(socket);
+              socket.cast<List<int>>().pipe(detached);
+              detached.cast<List<int>>().pipe(socket);
             });
           });
         } else {
diff --git a/test/http_proxy_test.dart b/test/http_proxy_test.dart
index ab759ea..286d192 100644
--- a/test/http_proxy_test.dart
+++ b/test/http_proxy_test.dart
@@ -228,8 +228,8 @@
           Socket.connect(tmp[0], int.parse(tmp[1])).then((socket) {
             request.response.reasonPhrase = "Connection established";
             request.response.detachSocket().then((detached) {
-              socket.pipe(detached);
-              detached.pipe(socket);
+              socket.cast<List<int>>().pipe(detached);
+              detached.cast<List<int>>().pipe(socket);
             });
           });
         } else {
