diff --git a/CHANGELOG.md b/CHANGELOG.md
index b59769d..45e8aee 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -71,6 +71,11 @@
   * Make `pub run` run executables in spawned isolates. This lets them handle
     signals and use standard IO reliably.
 
+  * Fix source-maps produced by dart2js when running in `pub serve`: URL
+    references to assets from packages match the location where `pub serve`
+    serves them (`packages/package_name/` instead of
+    `../packages/package_name/`).
+
 ### Infrastructure changes
 
   * The SDK now uses GN rather than gyp to generate its build files, which will
diff --git a/DEPS b/DEPS
index a9c1ea3..bdfb97e 100644
--- a/DEPS
+++ b/DEPS
@@ -92,7 +92,7 @@
   "ply_rev": "@604b32590ffad5cbb82e4afef1d305512d06ae93",
   "pool_tag": "@1.2.4",
   "protobuf_tag": "@0.5.3",
-  "pub_rev": "@9000daf329445d06e2404d4bb9020cf742b7308a",
+  "pub_rev": "@53327f4a7ca2ddd20a40f6a94db61ac136371b03",
   "pub_semver_tag": "@1.3.0",
   "quiver_tag": "@0.22.0",
   "resource_rev":"@a49101ba2deb29c728acba6fb86000a8f730f4b1",
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index ffef5db..26c1a02 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -5239,9 +5239,13 @@
     if (node is TypeName) {
       if (node.typeArguments == null) {
         DartType type = node.type;
-        if (type is InterfaceType && type.element.typeParameters.isNotEmpty) {
-          _errorReporter.reportErrorForNode(
-              StrongModeCode.NOT_INSTANTIATED_BOUND, node, [type]);
+        if (type is ParameterizedType) {
+          Element element = type.element;
+          if (element is TypeParameterizedElement &&
+              element.typeParameters.any((p) => p.bound != null)) {
+            _errorReporter.reportErrorForNode(
+                StrongModeCode.NOT_INSTANTIATED_BOUND, node, [type]);
+          }
         }
       } else {
         node.typeArguments.arguments.forEach(_checkForNotInstantiatedBound);
diff --git a/pkg/analyzer/lib/src/summary/link.dart b/pkg/analyzer/lib/src/summary/link.dart
index 67c5149..486ddc3 100644
--- a/pkg/analyzer/lib/src/summary/link.dart
+++ b/pkg/analyzer/lib/src/summary/link.dart
@@ -4660,6 +4660,9 @@
         var linker = functionElement.compilationUnit.library._linker;
         var typeProvider = linker.typeProvider;
         var typeSystem = linker.typeSystem;
+        if (bodyType.isDartAsyncFutureOr) {
+          bodyType = (bodyType as InterfaceType).typeArguments[0];
+        }
         bodyType = typeProvider.futureType
             .instantiate([bodyType.flattenFutures(typeSystem)]);
       }
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index a90fe14..364bcf5 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -2717,7 +2717,7 @@
 
 class B<T extends num> {}
 
-class C<S extends int, T extends B<S>, U extends B> {}
+class C<S extends int, T extends B<S>, U extends A> {}
 
 void test() {
 //
@@ -2729,13 +2729,13 @@
   var cc = new C();
 }
 ''';
-    await resolveTestUnit(code, noErrors: false);
+    await resolveTestUnit(code);
     expectIdentifierType('ai', "A<dynamic>");
     expectIdentifierType('bi', "B<num>");
-    expectIdentifierType('ci', "C<int, B<int>, B<dynamic>>");
+    expectIdentifierType('ci', "C<int, B<int>, A<dynamic>>");
     expectIdentifierType('aa', "A<dynamic>");
     expectIdentifierType('bb', "B<num>");
-    expectIdentifierType('cc', "C<int, B<int>, B<dynamic>>");
+    expectIdentifierType('cc', "C<int, B<int>, A<dynamic>>");
   }
 
   test_instantiateToBounds_class_error_recursion() async {
@@ -2769,6 +2769,28 @@
     expectIdentifierType('c;', 'C<dynamic>');
   }
 
+  test_instantiateToBounds_class_error_typedef() async {
+    String code = r'''
+typedef T F<T>(T x);
+class C<T extends F<T>> {}
+C c;
+''';
+    await resolveTestUnit(code, noErrors: false);
+    assertErrors(testSource, [StrongModeCode.NO_DEFAULT_BOUNDS]);
+    expectIdentifierType('c;', 'C<dynamic>');
+  }
+
+  test_instantiateToBounds_class_ok_implicitDynamic_multi() async {
+    String code = r'''
+class C<T0 extends Map<T1, T2>, T1 extends List, T2 extends int> {}
+C c;
+''';
+    await resolveTestUnit(code);
+    assertNoErrors(testSource);
+    expectIdentifierType(
+        'c;', 'C<Map<List<dynamic>, int>, List<dynamic>, int>');
+  }
+
   test_instantiateToBounds_class_ok_referenceOther_after() async {
     String code = r'''
 class C<T0 extends T1, T1 extends int> {}
@@ -2814,11 +2836,12 @@
 class A<T> {}
 class B<T extends num> {}
 class C<T extends List<int>> {}
-
+class D<T extends A> {}
 void main() {
   A a;
   B b;
   C c;
+  D d;
 }
 ''';
     await resolveTestUnit(code);
@@ -2826,6 +2849,7 @@
     expectIdentifierType('a;', 'A<dynamic>');
     expectIdentifierType('b;', 'B<num>');
     expectIdentifierType('c;', 'C<List<int>>');
+    expectIdentifierType('d;', 'D<A<dynamic>>');
   }
 
   test_instantiateToBounds_method_ok_referenceOther_before() async {
@@ -2858,29 +2882,51 @@
     expectStaticInvokeType('m(null)', '(T) → void');
   }
 
-  test_notInstantiatedBound_direct() async {
+  test_notInstantiatedBound_direct_class_class() async {
     String code = r'''
-class A<T> {}
+class A<T extends int> {}
 class C<T extends A> {}
 ''';
     await resolveTestUnit(code, noErrors: false);
     assertErrors(testSource, [StrongModeCode.NOT_INSTANTIATED_BOUND]);
   }
 
-  test_notInstantiatedBound_indirect() async {
+  test_notInstantiatedBound_direct_class_typedef() async {
+    // Check that if the bound of a class is an uninstantiated typedef
+    // we emit an error
+    String code = r'''
+typedef void F<T extends int>();
+class C<T extends F> {}
+''';
+    await resolveTestUnit(code, noErrors: false);
+    assertErrors(testSource, [StrongModeCode.NOT_INSTANTIATED_BOUND]);
+  }
+
+  test_notInstantiatedBound_direct_typedef_class() async {
+    // Check that if the bound of a typeded is an uninstantiated class
+    // we emit an error
+    String code = r'''
+class C<T extends int> {}
+typedef void F<T extends C>();
+''';
+    await resolveTestUnit(code, noErrors: false);
+    assertErrors(testSource, [StrongModeCode.NOT_INSTANTIATED_BOUND]);
+  }
+
+  test_notInstantiatedBound_indirect_class_class() async {
     String code = r'''
 class A<T> {}
-class B<T> {}
+class B<T extends int> {}
 class C<T extends A<B>> {}
 ''';
     await resolveTestUnit(code, noErrors: false);
     assertErrors(testSource, [StrongModeCode.NOT_INSTANTIATED_BOUND]);
   }
 
-  test_notInstantiatedBound_indirect2() async {
+  test_notInstantiatedBound_indirect_class_class2() async {
     String code = r'''
 class A<K, V> {}
-class B<T> {}
+class B<T extends int> {}
 class C<T extends A<B, B>> {}
 ''';
     await resolveTestUnit(code, noErrors: false);
diff --git a/pkg/analyzer/test/src/task/strong/checker_test.dart b/pkg/analyzer/test/src/task/strong/checker_test.dart
index 69ae478..c38122e 100644
--- a/pkg/analyzer/test/src/task/strong/checker_test.dart
+++ b/pkg/analyzer/test/src/task/strong/checker_test.dart
@@ -2427,7 +2427,7 @@
   void test_implicitDynamic_type() {
     addFile(r'''
 class C<T> {}
-class M1<T extends /*error:IMPLICIT_DYNAMIC_TYPE*//*error:NOT_INSTANTIATED_BOUND*/List> {}
+class M1<T extends /*error:IMPLICIT_DYNAMIC_TYPE*/List> {}
 class M2<T> {}
 class I<T> {}
 class D<T, S> extends /*error:IMPLICIT_DYNAMIC_TYPE*/C
diff --git a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
index 5d5874a..541e75f 100644
--- a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
+++ b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
@@ -61,6 +61,24 @@
     expect(f.type.toString(), '() → Future<int>');
   }
 
+  void test_asyncClosureReturnType_futureOr() {
+    var mainUnit = checkFile('''
+import 'dart:async';
+FutureOr<int> futureOrInt = null;
+var f = () => futureOrInt;
+var g = () async => futureOrInt;
+''');
+    var futureOrInt = mainUnit.topLevelVariables[0];
+    expect(futureOrInt.name, 'futureOrInt');
+    expect(futureOrInt.type.toString(), 'FutureOr<int>');
+    var f = mainUnit.topLevelVariables[1];
+    expect(f.name, 'f');
+    expect(f.type.toString(), '() → FutureOr<int>');
+    var g = mainUnit.topLevelVariables[2];
+    expect(g.name, 'g');
+    expect(g.type.toString(), '() → Future<int>');
+  }
+
   void test_blockBodiedLambdas_async_allReturnsAreFutures() {
     if (!mayCheckTypesOfLocals) {
       return;
@@ -1665,6 +1683,19 @@
     expect(x.type.toString(), 'int');
   }
 
+  void test_futureOr_subtyping() {
+    checkFile(r'''
+import 'dart:async';
+void add(int x) {}
+add2(int y) {}
+main() {
+  Future<int> f;
+  var a = f.then(add);
+  var b = f.then(add2);
+}
+    ''');
+  }
+
   void test_futureThen() {
     String build({String declared, String downwards, String upwards}) => '''
 import 'dart:async';
@@ -1855,19 +1886,6 @@
     ''');
   }
 
-  void test_futureOr_subtyping() {
-    checkFile(r'''
-import 'dart:async';
-void add(int x) {}
-add2(int y) {}
-main() {
-  Future<int> f;
-  var a = f.then(add);
-  var b = f.then(add2);
-}
-    ''');
-  }
-
   void test_futureUnion_asyncConditional() {
     String build({String declared, String downwards, String upwards}) => '''
 import 'dart:async';
@@ -4272,7 +4290,7 @@
   void test_instantiateToBounds_generic2_noBound() {
     var unit = checkFile(r'''
 class A<T> {}
-class B<T extends /*error:NOT_INSTANTIATED_BOUND*/A> {}
+class B<T extends A> {}
 B v = null;
 ''');
     expect(unit.topLevelVariables[0].type.toString(), 'B<A<dynamic>>');
diff --git a/tools/VERSION b/tools/VERSION
index 4e9ac1f..4eb30ea 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -28,4 +28,4 @@
 MINOR 22
 PATCH 0
 PRERELEASE 10
-PRERELEASE_PATCH 1
+PRERELEASE_PATCH 2
