diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ImportValidator.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ImportValidator.java
index b161765..2959fc2 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ImportValidator.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ImportValidator.java
@@ -10,16 +10,20 @@
 
 import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.IMPORT__IMPORT_URI;
 import static com.google.eclipse.protobuf.validation.Messages.importingNonProto2;
+import static org.eclipse.xtext.util.Tuples.pair;
+
+import java.util.*;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.*;
+import org.eclipse.xtext.util.Pair;
+import org.eclipse.xtext.validation.*;
 
 import com.google.eclipse.protobuf.model.util.*;
 import com.google.eclipse.protobuf.parser.NonProto2;
 import com.google.eclipse.protobuf.protobuf.*;
 import com.google.inject.Inject;
 
-import org.eclipse.emf.ecore.resource.*;
-import org.eclipse.emf.ecore.resource.Resource.Diagnostic;
-import org.eclipse.xtext.validation.*;
-
 /**
  * @author alruiz@google.com (Alex Ruiz)
  */
@@ -39,21 +43,52 @@
     Protobuf root = finder.rootOf(resource);
     if (isNotProto2(root)) return;
     ResourceSet resourceSet = resource.getResourceSet();
+    boolean hasNonProto2 = false;
+    List<Pair<Import, Resource>> resourcesToCheck = new ArrayList<Pair<Import, Resource>>();
+    Set<URI> checked = new HashSet<URI>();
+    checked.add(resource.getURI());
     for (Import anImport : finder.importsIn(root)) {
       Resource imported = resources.importedResource(anImport, resourceSet);
+      checked.add(imported.getURI());
       if (isNotProto2(finder.rootOf(imported))) {
-        acceptWarning(importingNonProto2, anImport, IMPORT__IMPORT_URI, INSIGNIFICANT_INDEX, null);
+        hasNonProto2 = true;
+        warnNonProto2ImportFoundIn(anImport);
         continue;
       }
-      for (Diagnostic d : imported.getWarnings()) {
-        if (importingNonProto2.equals(d.getMessage())) {
-          acceptWarning(importingNonProto2, anImport, IMPORT__IMPORT_URI, INSIGNIFICANT_INDEX, null);
-        }
+      resourcesToCheck.add(pair(anImport, imported));
+    }
+    if (hasNonProto2) return;
+    for (Pair<Import, Resource> p : resourcesToCheck) {
+      if (hasNonProto2(p, checked, resourceSet)) {
+        warnNonProto2ImportFoundIn(p.getFirst());
+        break;
       }
     }
   }
-  
+
+  private boolean hasNonProto2(Pair<Import, Resource> toCheck, Set<URI> checked, ResourceSet resourceSet) {
+    Protobuf root = finder.rootOf(toCheck.getSecond());
+    if (isNotProto2(root)) return false;
+    List<Pair<Import, Resource>> resourcesToCheck = new ArrayList<Pair<Import, Resource>>();
+    for (Import anImport : finder.importsIn(root)) {
+      Resource imported = resources.importedResource(anImport, resourceSet);
+      if (checked.contains(imported.getURI())) continue;
+      if (isNotProto2(finder.rootOf(imported))) {
+        return true;
+      }
+      resourcesToCheck.add(pair(toCheck.getFirst(), imported));
+    }
+    for (Pair<Import, Resource> p : resourcesToCheck) {
+      if (hasNonProto2(p, checked, resourceSet)) return true;
+    }
+    return false;
+  }
+
   private boolean isNotProto2(Protobuf root) {
     return root instanceof NonProto2;
   }
+
+  private void warnNonProto2ImportFoundIn(Import anImport) {
+    acceptWarning(importingNonProto2, anImport, IMPORT__IMPORT_URI, INSIGNIFICANT_INDEX, null);
+  }
 }
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/Messages.properties b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/Messages.properties
index 7f8eb32..adfad66 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/Messages.properties
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/Messages.properties
@@ -5,7 +5,7 @@
 expectedTrueOrFalse = Expected "true" or "false".
 fieldNumberAlreadyUsed = Field number %d has already been used in \"%s\" by field \"%s\".
 fieldNumbersMustBePositive = Field numbers must be positive integers.
-importingNonProto2 = Importing non-proto2 file. This may result in errors related to unresolved references.
+importingNonProto2 = Importing non-proto2 file (directly or indirectly.) This may cause errors related to unresolved references.
 importNotFound = Import \"%s\" was not found.
 missingFieldNumber = Missing field number.
 multiplePackages = Multiple package definitions.
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ProtobufResourceValidator.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ProtobufResourceValidator.java
index e16ee7c..b83e052 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ProtobufResourceValidator.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ProtobufResourceValidator.java
@@ -18,7 +18,7 @@
 import static org.eclipse.xtext.validation.CheckType.FAST;
 import static org.eclipse.xtext.validation.impl.ConcreteSyntaxEValidator.DISABLE_CONCRETE_SYNTAX_EVALIDATOR;
 
-import com.google.eclipse.protobuf.linking.ProtobufLinkingDiagnostic;
+import java.util.*;
 
 import org.apache.log4j.Logger;
 import org.eclipse.emf.common.util.Diagnostic;
@@ -29,7 +29,7 @@
 import org.eclipse.xtext.util.*;
 import org.eclipse.xtext.validation.*;
 
-import java.util.*;
+import com.google.eclipse.protobuf.linking.ProtobufLinkingDiagnostic;
 
 /**
  * Adds support for converting scoping errors into warnings if non-proto2 files are imported.
@@ -39,7 +39,7 @@
 public class ProtobufResourceValidator extends ResourceValidatorImpl {
 
   private static final Logger log = Logger.getLogger(ProtobufResourceValidator.class);
-  
+
   @Override public List<Issue> validate(Resource resource, CheckMode mode, CancelIndicator indicator) {
     CancelIndicator monitor = indicator == null ? CancelIndicator.NullImpl : indicator;
     resolveProxies(resource, monitor);
@@ -71,9 +71,11 @@
           if (hasNonProto2Import && isUnresolveReferenceError(error)) {
             severity = WARNING;
             ProtobufLinkingDiagnostic d = (ProtobufLinkingDiagnostic) error;
-            if (!d.getMessage().endsWith(".")) d.appendToMessage(".");
-            d.appendToMessage(" ");
-            d.appendToMessage(scopingError);
+            if (!d.getMessage().endsWith(scopingError)) {
+              if (!d.getMessage().endsWith(".")) d.appendToMessage(".");
+              d.appendToMessage(" ");
+              d.appendToMessage(scopingError);
+            }
           }
           issueFromXtextResourceDiagnostic(error, severity, acceptor);
         }
