  
    TypeValidator(AbstractCompiler compiler) {
      this.compiler = compiler;
-@@ -564,14 +555,24 @@ class TypeValidator {
-    * Expect that all properties on interfaces that this type implements are
-    * implemented and correctly typed.
-    */
--  void expectAllInterfaceProperties(NodeTraversal t, Node n,
--      FunctionType type) {
-+  void expectAllInterfacePropertiesImplemented(FunctionType type) {
-     ObjectType instance = type.getInstanceType();
-     for (ObjectType implemented : type.getAllImplementedInterfaces()) {
-       if (implemented.getImplicitPrototype() != null) {
-         for (String prop :
-             implemented.getImplicitPrototype().getOwnPropertyNames()) {
--          expectInterfaceProperty(t, n, instance, implemented, prop);
-+          if (!instance.hasProperty(prop)) {
-+            Node source = type.getSource();
-+            Preconditions.checkNotNull(source);
-+            String sourceName = (String) source.getProp(Node.SOURCENAME_PROP);
-+            sourceName = sourceName == null ? "" : sourceName;
-+            if (shouldReport) {
-+              compiler.report(JSError.make(sourceName, source,
-+                  INTERFACE_METHOD_NOT_IMPLEMENTED,
-+                  prop, implemented.toString(), instance.toString()));
-+            }
-+            registerMismatch(instance, implemented);
-+          }
-         }
+@@ -593,24 +585,7 @@ class TypeValidator {
+             prop, implementedInterface.toString(), instance.toString()));
        }
-     }
-@@ -581,38 +582,6 @@ class TypeValidator {
-    * Expect that the peroperty in an interface that this type implements is
-    * implemented and correctly typed.
-    */
--  private void expectInterfaceProperty(NodeTraversal t, Node n,
--      ObjectType instance, ObjectType implementedInterface, String prop) {
--    if (!instance.hasProperty(prop)) {
--      // Not implemented
--      String sourceName = (String) n.getProp(Node.SOURCENAME_PROP);
--      sourceName = sourceName == null ? "" : sourceName;
--      if (shouldReport) {
--        compiler.report(JSError.make(sourceName, n,
--            INTERFACE_METHOD_NOT_IMPLEMENTED,
--            prop, implementedInterface.toString(), instance.toString()));
--      }
--      registerMismatch(instance, implementedInterface);
+       registerMismatch(instance, implementedInterface);
 -    } else {
 -      JSType found = instance.getPropertyType(prop);
 -      JSType required

-        "of the property it overrides from interface {1}\n" +
-        "original: {2}\n" +
-        "override: {3}");
-
   static final DiagnosticGroup ALL_DIAGNOSTICS = new DiagnosticGroup(
       INVALID_CAST,
       TYPE_MISMATCH_WARNING,
       MISSING_EXTENDS_TAG_WARNING,
       DUP_VAR_DECLARATION,
       HIDDEN_PROPERTY_MISMATCH,

-      found = found.restrictByNotNullOrUndefined();
-      required = required.restrictByNotNullOrUndefined();
-      if (!found.canAssignTo(required)) {
         // Implemented, but not correctly typed
-        if (shouldReport) {
-          FunctionType constructor
-            = implementedInterface.toObjectType().getConstructor();
