Version 2.5.1
diff --git a/CHANGELOG.md b/CHANGELOG.md
index dff27ac..d9ef813 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+## 2.5.1 - 2019-09-27
+
+This is a patch release that prevents type inference failures in the analyzer
+(Issue [38365][]).
+
+[38365]: https://github.com/dart-lang/sdk/issues/38365
+
 ## 2.5.0 - 2019-09-10
 
 ### Language
diff --git a/pkg/analyzer/lib/src/dart/element/type_algebra.dart b/pkg/analyzer/lib/src/dart/element/type_algebra.dart
index fede84b..e841369 100644
--- a/pkg/analyzer/lib/src/dart/element/type_algebra.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_algebra.dart
@@ -201,6 +201,34 @@
     return freshElement;
   }
 
+  @override
+  List<TypeParameterElement> freshTypeParameters(
+      List<TypeParameterElement> elements) {
+    if (elements.isEmpty) {
+      return const <TypeParameterElement>[];
+    }
+
+    var freshElements = List<TypeParameterElement>(elements.length);
+    for (var i = 0; i < elements.length; i++) {
+      var element = elements[i];
+      var freshElement = TypeParameterElementImpl(element.name, -1);
+      freshElements[i] = freshElement;
+      var freshType = TypeParameterTypeImpl(freshElement);
+      freshElement.type = freshType;
+      substitution[element] = freshType;
+    }
+
+    for (var i = 0; i < freshElements.length; i++) {
+      var element = elements[i];
+      if (element.bound != null) {
+        TypeParameterElementImpl freshElement = freshElements[i];
+        freshElement.bound = visit(element.bound);
+      }
+    }
+
+    return freshElements;
+  }
+
   DartType lookup(TypeParameterElement parameter, bool upperBound) {
     return substitution[parameter];
   }
@@ -247,8 +275,8 @@
     }
   }
 
-  @override
-  TypeParameterElement freshTypeParameter(TypeParameterElement element) {
+  List<TypeParameterElement> freshTypeParameters(
+      List<TypeParameterElement> parameters) {
     throw 'Create a fresh environment first';
   }
 
@@ -283,15 +311,8 @@
     target.useCounter++;
   }
 
-  TypeParameterElement freshTypeParameter(TypeParameterElement element);
-
   List<TypeParameterElement> freshTypeParameters(
-      List<TypeParameterElement> parameters) {
-    if (parameters.isEmpty) {
-      return const <TypeParameterElement>[];
-    }
-    return parameters.map(freshTypeParameter).toList();
-  }
+      List<TypeParameterElement> elements);
 
   DartType getSubstitute(TypeParameterElement parameter) {
     var environment = this;
@@ -339,14 +360,18 @@
     // any uses, but does not tell if the resulting function type is distinct.
     // Our own use counter will get incremented if something from our
     // environment has been used inside the function.
-    var inner = type.typeFormals.isEmpty ? this : newInnerEnvironment();
     int before = this.useCounter;
 
+    var inner = this;
+    var typeFormals = type.typeFormals;
+    if (typeFormals.isNotEmpty) {
+      inner = newInnerEnvironment();
+      typeFormals = inner.freshTypeParameters(typeFormals);
+    }
+
     // Invert the variance when translating parameters.
     inner.invertVariance();
 
-    var typeFormals = inner.freshTypeParameters(type.typeFormals);
-
     var parameters = type.parameters.map((parameter) {
       var type = inner.visit(parameter.type);
       return _parameterElement(parameter, type);
@@ -376,14 +401,18 @@
     // any uses, but does not tell if the resulting function type is distinct.
     // Our own use counter will get incremented if something from our
     // environment has been used inside the function.
-    var inner = type.typeFormals.isEmpty ? this : newInnerEnvironment();
     int before = this.useCounter;
 
+    var inner = this;
+    var typeFormals = type.typeFormals;
+    if (typeFormals.isNotEmpty) {
+      inner = newInnerEnvironment();
+      typeFormals = inner.freshTypeParameters(typeFormals);
+    }
+
     // Invert the variance when translating parameters.
     inner.invertVariance();
 
-    var typeFormals = inner.freshTypeParameters(type.typeFormals);
-
     var parameters = type.parameters.map((parameter) {
       var type = inner.visit(parameter.type);
       return _parameterElement(parameter, type);
diff --git a/tools/VERSION b/tools/VERSION
index 546548f..4ef1ceb 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -32,7 +32,7 @@
 CHANNEL stable
 MAJOR 2
 MINOR 5
-PATCH 0
+PATCH 1
 PRERELEASE 0
 PRERELEASE_PATCH 0
 ABI_VERSION 11