diff --git a/pkg/analyzer/test/src/task/strong/checker_test.dart b/pkg/analyzer/test/src/task/strong/checker_test.dart
index 299a327..2c79318 100644
--- a/pkg/analyzer/test/src/task/strong/checker_test.dart
+++ b/pkg/analyzer/test/src/task/strong/checker_test.dart
@@ -41,101 +41,6 @@
     ]);
   }
 
-  test_classOverrideOfGrandInterface_interfaceOfAbstractSuperclass() async {
-    await assertErrorsInCode('''
-class A {}
-class B {}
-
-abstract class I1 {
-  m(A a);
-}
-abstract class Base implements I1 {}
-
-class T1 extends Base {
-  m(B a) {}
-}
-''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 119, 1),
-    ]);
-  }
-
-  test_classOverrideOfGrandInterface_interfaceOfConcreteSuperclass() async {
-    await assertErrorsInCode('''
-class A {}
-class B {}
-
-abstract class I1 {
-  m(A a);
-}
-
-class Base implements I1 {}
-
-class T1 extends Base {
-  m(B a) {}
-}
-''', [
-      error(
-          CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
-          62,
-          4),
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 111, 1),
-    ]);
-  }
-
-  test_classOverrideOfGrandInterface_interfaceOfInterfaceOfChild() async {
-    await assertErrorsInCode('''
-class A {}
-class B {}
-
-abstract class I1 {
-  m(A a);
-}
-abstract class I2 implements I1 {}
-
-class T1 implements I2 {
-  m(B a) {}
-}
-''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 118, 1),
-    ]);
-  }
-
-  test_classOverrideOfGrandInterface_mixinOfInterfaceOfChild() async {
-    await assertErrorsInCode('''
-class A {}
-class B {}
-
-abstract class M1 {
-  m(A a);
-}
-abstract class I2 extends Object with M1 {}
-
-class T1 implements I2 {
-  m(B a) {}
-}
-''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 127, 1),
-    ]);
-  }
-
-  test_classOverrideOfGrandInterface_superclassOfInterfaceOfChild() async {
-    await assertErrorsInCode('''
-class A {}
-class B {}
-
-abstract class I1 {
-  m(A a);
-}
-abstract class I2 extends I1 {}
-
-class T1 implements I2 {
-  m(B a) {}
-}
-''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 115, 1),
-    ]);
-  }
-
   test_compoundAssignment_returnsDynamic() async {
     await assertNoErrorsInCode(r'''
 class Foo {
@@ -299,18 +204,6 @@
 ''');
   }
 
-  test_constructorInvalid() async {
-    // Regression test for https://github.com/dart-lang/sdk/issues/26695
-    await assertErrorsInCode('''
-class A {
-  B({this.test: 1.0 }) {}
-  final double test = 0.0;
-}
-''', [
-      error(CompileTimeErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTOR, 15, 9),
-    ]);
-  }
-
   test_constructors() async {
     await assertErrorsInCode('''
 const num z = 25;
@@ -440,65 +333,6 @@
     ]);
   }
 
-  test_covariantOverride() async {
-    await assertErrorsInCode(r'''
-class C {
-  num f(num x) => x;
-}
-class D extends C {
-  int f(covariant int x) => x;
-}
-class E extends D {
-  int f(Object x) => x;
-}
-class F extends E {
-  int f(covariant int x) => x;
-}
-class G extends E implements D {}
-
-class D_error extends C {
-  int f(int x) => x;
-}
-class E_error extends D {
-  int f(covariant double x) => 0;
-}
-class F_error extends E {
-  int f(covariant double x) => 0;
-}
-class G_error extends E implements D {
-  int f(covariant double x) => 0;
-}
-''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 252, 1),
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 301, 1),
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 363, 1),
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 438, 1),
-    ]);
-  }
-
-  @failingTest
-  test_covariantOverride_fields() async {
-    await assertNoErrorsInCode(r'''
-class A {
-  get foo => '';
-  set foo(_) {}
-}
-
-class B extends A {
-  covariant num foo;
-}
-class C extends A {
-  covariant num foo;
-}
-class D extends C {
-  int foo;
-}
-class E extends D {
-  num foo;
-}
-''');
-  }
-
   test_covariantOverride_leastUpperBound() async {
     await assertNoErrorsInCode(r'''
 abstract class Top {}
@@ -638,168 +472,6 @@
     ]);
   }
 
-  test_factoryConstructorDowncast() async {
-    await assertErrorsInCode(r'''
-class Animal {
-  Animal();
-  factory Animal.cat() => new Cat();
-}
-
-class Cat extends Animal {}
-
-void main() {
-  Cat c = new Animal.cat();
-  c = new Animal();
-}''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 116, 1),
-      error(CompileTimeErrorCode.INVALID_CAST_NEW_EXPR, 144, 12),
-    ]);
-  }
-
-  test_fieldFieldOverride() async {
-    await assertErrorsInCode('''
-class A {}
-class B extends A {}
-class C extends B {}
-
-class Base {
-  B f1;
-  B f2;
-  B f3;
-  B f4;
-}
-
-class Child extends Base {
-  A f1; // invalid for getter
-  C f2; // invalid for setter
-  var f3;
-  dynamic f4;
-}
-
-class Child2 implements Base {
-  A f1; // invalid for getter
-  C f2; // invalid for setter
-  var f3;
-  dynamic f4;
-}
-''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 133, 2),
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 163, 2),
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 209, 2),
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 251, 2),
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 281, 2),
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 327, 2),
-    ]);
-  }
-
-  test_fieldGetterOverride() async {
-    await assertErrorsInCode('''
-class A {}
-class B extends A {}
-class C extends B {}
-
-abstract class Base {
-  B f1;
-  B f2;
-  B f3;
-  B f4;
-}
-
-class Child extends Base {
-  A get f1 => null;
-  C get f2 => null;
-  get f3 => null;
-  dynamic get f4 => null;
-}
-
-class Child2 implements Base {
-  A get f1 => null;
-  C get f2 => null;
-  get f3 => null;
-  dynamic get f4 => null;
-}
-''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 146, 2),
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 210, 2),
-      error(
-          CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR,
-          231,
-          6),
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 264, 2),
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 328, 2),
-    ]);
-  }
-
-  test_fieldOverride() async {
-    await assertErrorsInCode('''
-typedef void ToVoid<T>(T x);
-class F {
-  final ToVoid<dynamic> f = null;
-  final ToVoid<int> g = null;
-}
-
-class G extends F {
-  final ToVoid<int> f = null;
-  final ToVoid<dynamic> g = null;
-}
-
-class H implements F {
-  final ToVoid<int> f = null;
-  final ToVoid<dynamic> g = null;
-}
- ''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 146, 1),
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 236, 1),
-    ]);
-  }
-
-  test_fieldSetterOverride() async {
-    await assertErrorsInCode('''
-class A {}
-class B extends A {}
-class C extends B {}
-
-class Base {
-  B f1;
-  B f2;
-  B f3;
-  B f4;
-  B f5;
-}
-
-class Child extends Base {
-  B get f1 => null;
-  B get f2 => null;
-  B get f3 => null;
-  B get f4 => null;
-  B get f5 => null;
-
-  void set f1(A value) {}
-  void set f2(C value) {}
-  void set f3(value) {}
-  void set f4(dynamic value) {}
-  set f5(B value) {}
-}
-
-class Child2 implements Base {
-  B get f1 => null;
-  B get f2 => null;
-  B get f3 => null;
-  B get f4 => null;
-  B get f5 => null;
-
-  void set f1(A value) {}
-  void set f2(C value) {}
-  void set f3(value) {}
-  void set f4(dynamic value) {}
-  set f5(B value) {}
-}
-''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 275, 2),
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 539, 2),
-    ]);
-  }
-
   test_functionModifiers_async() async {
     await assertErrorsInCode('''
 import 'dart:math' show Random;
diff --git a/tools/VERSION b/tools/VERSION
index bf7d38a..134fd10 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 68
+PRERELEASE 69
 PRERELEASE_PATCH 0
\ No newline at end of file
