diff --git a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/validation/ImportValidator_checkNonProto2Imports_Test.java b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/validation/ImportValidator_checkNonProto2Imports_Test.java
new file mode 100644
index 0000000..5b9a99b
--- /dev/null
+++ b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/validation/ImportValidator_checkNonProto2Imports_Test.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2012 Google Inc.
+ *
+ * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 which accompanies this distribution, and is available at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package com.google.eclipse.protobuf.validation;
+
+import static com.google.eclipse.protobuf.junit.core.IntegrationTestModule.integrationTestModule;
+import static com.google.eclipse.protobuf.junit.core.XtextRule.overrideRuntimeModuleWith;
+import static org.mockito.Mockito.*;
+
+import org.eclipse.xtext.validation.ValidationMessageAcceptor;
+import org.junit.*;
+
+import com.google.eclipse.protobuf.junit.core.XtextRule;
+import com.google.eclipse.protobuf.protobuf.Protobuf;
+import com.google.inject.Inject;
+
+/**
+ * Tests for <code>{@link ImportValidator#checkNonProto2Imports(Protobuf)}</code>
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class ImportValidator_checkNonProto2Imports_Test {
+  @Rule public XtextRule xtext = overrideRuntimeModuleWith(integrationTestModule());
+
+  @Inject private ImportValidator validator;
+  private ValidationMessageAcceptor messageAcceptor;
+
+  @Before public void setUp() {
+    messageAcceptor = mock(ValidationMessageAcceptor.class);
+    validator.setMessageAcceptor(messageAcceptor);
+  }
+
+  // // Create file C.proto
+  //
+  // syntax = 'proto2';
+
+  // // Create file B.proto
+  //
+  // syntax = 'proto2';
+  //
+  // import "C.proto";
+
+  // syntax = "proto2";
+  //
+  // import "B.proto";
+  // import "C.proto";
+  @Test public void should_not_add_warnings_if_imported_files_are_proto2() {
+    validator.checkNonProto2Imports(xtext.root());
+    verifyNoMoreInteractions(messageAcceptor);
+  }
+
+  // // Create file C.proto
+  //
+  // syntax = 'proto2';
+  //
+  // import "B.proto";
+
+  // // Create file B.proto
+  //
+  // syntax = 'proto2';
+  //
+  // import "C.proto";
+
+  // syntax = "proto2";
+  //
+  // import "B.proto";
+  // import "C.proto";
+  @Test public void should_not_add_warnings_if_imported_files_are_proto2_even_with_circular_dependencies() {
+    validator.checkNonProto2Imports(xtext.root());
+    verifyNoMoreInteractions(messageAcceptor);
+  }
+}
diff --git a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/validation/ImportValidator_checkNonProto2Imports_withNonProto2Imports_Tests.java b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/validation/ImportValidator_checkNonProto2Imports_withNonProto2Imports_Tests.java
new file mode 100644
index 0000000..d8f8aa9
--- /dev/null
+++ b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/validation/ImportValidator_checkNonProto2Imports_withNonProto2Imports_Tests.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 2012 Google Inc.
+ *
+ * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 which accompanies this distribution, and is available at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package com.google.eclipse.protobuf.validation;
+
+import static com.google.eclipse.protobuf.junit.core.IntegrationTestModule.integrationTestModule;
+import static com.google.eclipse.protobuf.junit.core.XtextRule.overrideRuntimeModuleWith;
+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.validation.ValidationMessageAcceptor.INSIGNIFICANT_INDEX;
+import static org.mockito.Mockito.*;
+
+import java.util.List;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.xtext.validation.ValidationMessageAcceptor;
+import org.junit.*;
+
+import com.google.eclipse.protobuf.junit.core.*;
+import com.google.eclipse.protobuf.model.util.Protobufs;
+import com.google.eclipse.protobuf.protobuf.*;
+import com.google.inject.*;
+
+/**
+ * Tests for <code>{@link ImportValidator#checkNonProto2Imports(Protobuf)}</code>
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class ImportValidator_checkNonProto2Imports_withNonProto2Imports_Tests {
+  @Rule public XtextRule xtext = overrideRuntimeModuleWith(integrationTestModule(), new TestModule());
+
+  @Inject private ProtobufsStub protobufs;
+  @Inject private ImportValidator validator;
+
+  private ValidationMessageAcceptor messageAcceptor;
+
+  @Before public void setUp() {
+    messageAcceptor = mock(ValidationMessageAcceptor.class);
+    validator.setMessageAcceptor(messageAcceptor);
+  }
+
+  // // Create file C.proto
+  //
+  // syntax = 'proto2';
+
+  // // Create file B.proto
+  //
+  // syntax = 'proto2';
+
+  // syntax = "proto2";
+  //
+  // import "B.proto";
+  // import "C.proto";
+  @Test public void should_add_warning_if_import_if_import_refers_directly_to_non_proto2() {
+    protobufs.nonProto2FileName = "B.proto";
+    validator.checkNonProto2Imports(xtext.root());
+    Import importWithNonProto2File = findImportReferreringToFile(protobufs.nonProto2FileName);
+    verifyThatImportingNonProto2FileCreatedWarning(importWithNonProto2File);
+  }
+
+  // // Create file C.proto
+  //
+  // syntax = 'proto2';
+
+  // // Create file B.proto
+  //
+  // syntax = 'proto2';
+  //
+  // import "C.proto";
+
+  // syntax = "proto2";
+  //
+  // import "B.proto";
+  @Test public void should_add_warning_if_import_if_import_refers_indirectly_to_non_proto2() {
+    protobufs.nonProto2FileName = "C.proto";
+    validator.checkNonProto2Imports(xtext.root());
+    Import importWithNonProto2File = findImportReferreringToFile("B.proto");
+    verifyThatImportingNonProto2FileCreatedWarning(importWithNonProto2File);
+  }
+
+  private Import findImportReferreringToFile(String fileName) {
+    List<Import> imports = protobufs.importsIn(xtext.root());
+    for (Import anImport : imports) {
+      if (anImport.getImportURI().endsWith(fileName)) {
+        return anImport;
+      }
+    }
+    return null;
+  }
+
+  private void verifyThatImportingNonProto2FileCreatedWarning(Import anImport) {
+    verify(messageAcceptor).acceptWarning(importingNonProto2, anImport, IMPORT__IMPORT_URI, INSIGNIFICANT_INDEX, null,
+        new String[0]);
+  }
+
+  private static class TestModule extends AbstractTestModule {
+    @Override protected void configure() {
+      binder().bind(Protobufs.class).to(ProtobufsStub.class);
+    }
+  }
+
+  @Singleton private static class ProtobufsStub extends Protobufs {
+    String nonProto2FileName;
+
+    @Override public boolean isProto2(Protobuf protobuf) {
+      URI resourceUri = protobuf.eResource().getURI();
+      if (resourceUri.toString().endsWith(nonProto2FileName)) {
+        return false;
+      }
+      return super.isProto2(protobuf);
+    }
+  }
+}
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/stubs/resources/ResourceStub.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/stubs/resources/ResourceStub.java
deleted file mode 100644
index f69bd43..0000000
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/stubs/resources/ResourceStub.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
- * Public License v1.0 which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- */
-package com.google.eclipse.protobuf.junit.stubs.resources;
-
-import static org.eclipse.emf.common.util.URI.createURI;
-
-import java.io.*;
-import java.util.Map;
-
-import org.eclipse.emf.common.notify.*;
-import org.eclipse.emf.common.util.*;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.*;
-
-/**
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class ResourceStub implements Resource {
-  private URI uri;
-
-  public ResourceStub() {}
-
-  public ResourceStub(String uri) {
-    setURI(createURI(uri));
-  }
-
-  /** {@inheritDoc} */
-  @Override public EList<Adapter> eAdapters() {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  @Override public boolean eDeliver() {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  @Override public void eSetDeliver(boolean deliver) {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  @Override public void eNotify(Notification notification) {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  @Override public ResourceSet getResourceSet() {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  @Override public URI getURI() {
-    return uri;
-  }
-
-  /** {@inheritDoc} */
-  @Override public void setURI(URI uri) {
-    this.uri = uri;
-  }
-
-  /** {@inheritDoc} */
-  @Override public long getTimeStamp() {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  @Override public void setTimeStamp(long timeStamp) {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  @Override public EList<EObject> getContents() {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  @Override public TreeIterator<EObject> getAllContents() {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  @Override public String getURIFragment(EObject eObject) {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  @Override public EObject getEObject(String uriFragment) {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  @Override public void save(Map<?, ?> options) {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  @Override public void load(Map<?, ?> options) {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  @Override public void save(OutputStream outputStream, Map<?, ?> options) {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  @Override public void load(InputStream inputStream, Map<?, ?> options) {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  @Override public boolean isTrackingModification() {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  @Override public void setTrackingModification(boolean isTrackingModification) {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  @Override public boolean isModified() {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  @Override public void setModified(boolean isModified) {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  @Override public boolean isLoaded() {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  @Override public void unload() {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  @Override public void delete(Map<?, ?> options) {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  @Override public EList<Diagnostic> getErrors() {
-    throw new UnsupportedOperationException();
-  }
-
-  /** {@inheritDoc} */
-  @Override public EList<Diagnostic> getWarnings() {
-    throw new UnsupportedOperationException();
-  }
-
-}
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/validation/ProtobufJavaValidator_checkOnlyOnePackageDefinition_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/validation/ProtobufJavaValidator_checkOnlyOnePackageDefinition_Test.java
index 3d3a260..0ea1264 100644
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/validation/ProtobufJavaValidator_checkOnlyOnePackageDefinition_Test.java
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/validation/ProtobufJavaValidator_checkOnlyOnePackageDefinition_Test.java
@@ -11,6 +11,7 @@
 import static com.google.eclipse.protobuf.junit.core.UnitTestModule.unitTestModule;
 import static com.google.eclipse.protobuf.junit.core.XtextRule.overrideRuntimeModuleWith;
 import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.PACKAGE__NAME;
+import static com.google.eclipse.protobuf.validation.Messages.multiplePackages;
 import static com.google.eclipse.protobuf.validation.ProtobufJavaValidator.MORE_THAN_ONE_PACKAGE_ERROR;
 import static org.eclipse.xtext.validation.ValidationMessageAcceptor.INSIGNIFICANT_INDEX;
 import static org.mockito.Mockito.*;
@@ -45,8 +46,7 @@
   @Test public void should_create_error_if_there_are_more_than_one_package_definitions() {
     Package p = xtext.find("com.google.eclipse", Package.class);
     validator.checkOnlyOnePackageDefinition(p);
-    String message = "Multiple package definitions.";
-    verify(messageAcceptor).acceptError(message, p, PACKAGE__NAME, INSIGNIFICANT_INDEX, MORE_THAN_ONE_PACKAGE_ERROR);
+    verify(messageAcceptor).acceptError(multiplePackages, p, PACKAGE__NAME, INSIGNIFICANT_INDEX, MORE_THAN_ONE_PACKAGE_ERROR);
   }
 
   // syntax = "proto2";
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Imports.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Imports.java
index 43af49e..408118c 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Imports.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Imports.java
@@ -13,10 +13,12 @@
 import static org.eclipse.xtext.util.Strings.*;
 
 import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.*;
 import org.eclipse.xtext.nodemodel.INode;
 import org.eclipse.xtext.scoping.impl.ImportUriResolver;
 
 import com.google.eclipse.protobuf.protobuf.Import;
+import com.google.eclipse.protobuf.resource.ResourceSets;
 import com.google.eclipse.protobuf.scoping.ProtoDescriptorProvider;
 import com.google.inject.Inject;
 
@@ -28,6 +30,7 @@
 public class Imports {
   @Inject private ProtoDescriptorProvider descriptorProvider;
   @Inject private INodes nodes;
+  @Inject private ResourceSets resourceSets;
   @Inject private ImportUriResolver uriResolver;
 
   /**
@@ -98,6 +101,21 @@
   }
 
   /**
+   * Returns the resource referred by the URI of the given {@code Import}.
+   * @param anImport the given {@code Import}.
+   * @return the resource referred by the URI of the given {@code Import}, or {@code null} if the URI has not been
+   * resolved.
+   */
+  public Resource importedResource(Import anImport) {
+    URI resolvedUri = resolvedUriOf(anImport);
+    if (resolvedUri != null) {
+      ResourceSet resourceSet = anImport.eResource().getResourceSet();
+      return resourceSets.findResource(resourceSet, resolvedUri);
+    }
+    return null;
+  }
+
+  /**
    * Returns the resolved URI of the given {@code Import}.
    * @param anImport the the given {@code Import}.
    * @return the resolved URI of the given {@code Import}, or {@code null} if the URI was not successfully resolved.
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 9f978ac..d852659 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
@@ -8,7 +8,7 @@
  */
 package com.google.eclipse.protobuf.validation;
 
-import static com.google.common.collect.Lists.newArrayList;
+import static com.google.common.collect.Maps.newHashMap;
 import static com.google.common.collect.Sets.newHashSet;
 import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.IMPORT__IMPORT_URI;
 import static com.google.eclipse.protobuf.validation.Messages.*;
@@ -17,15 +17,13 @@
 
 import java.util.*;
 
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.*;
+import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.xtext.scoping.impl.ImportUriResolver;
 import org.eclipse.xtext.util.Pair;
 import org.eclipse.xtext.validation.*;
 
 import com.google.eclipse.protobuf.model.util.*;
 import com.google.eclipse.protobuf.protobuf.*;
-import com.google.eclipse.protobuf.resource.ResourceSets;
 import com.google.inject.Inject;
 
 /**
@@ -37,85 +35,75 @@
   @Inject private Imports imports;
   @Inject private Protobufs protobufs;
   @Inject private Resources resources;
-  @Inject private ResourceSets resourceSets;
   @Inject private ImportUriResolver uriResolver;
 
   @Override public void register(EValidatorRegistrar registrar) {}
 
   /**
    * Verifies that {@code Import}s in the given root only refer to "proto2" files. If non-proto2 {@code Import}s are
-   * found, this validator will create warning markers for such "imports".
+   * found, this validator will create warning markers for such {@code Import}s.
    * @param root the root containing the imports to check.
    */
   @Check public void checkNonProto2Imports(Protobuf root) {
-    warnIfNonProto2ImportsFound(root.eResource());
-  }
-
-  private void warnIfNonProto2ImportsFound(Resource resource) {
-    Protobuf root = resources.rootOf(resource);
     if (!protobufs.isProto2(root)) {
       return;
     }
-    ResourceSet resourceSet = resource.getResourceSet();
-    boolean hasNonProto2 = false;
-    List<Pair<Import, Resource>> resourcesToCheck = newArrayList();
-    Set<URI> checked = newHashSet();
-    checked.add(resource.getURI());
+    Set<Protobuf> currentlyChecking = newHashSet(root);
+    HashMap<Protobuf, IsProto2> alreadyChecked = newHashMap();
+    hasNonProto2Imports(root, currentlyChecking, alreadyChecked);
+  }
+
+  private boolean hasNonProto2Imports(Protobuf root, Set<Protobuf> currentlyChecking,
+      Map<Protobuf, IsProto2> alreadyChecked) {
+    IsProto2 isProto2 = alreadyChecked.get(root);
+    if (isProto2 != null) {
+      return isProto2 == IsProto2.NO;
+    }
+    currentlyChecking.add(root);
+    Set<Pair<Import, Protobuf>> importsToCheck = newHashSet();
+    boolean hasNonProto2Imports = false;
     for (Import anImport : protobufs.importsIn(root)) {
-      Resource imported = importedResource(resourceSet, anImport);
-      checked.add(imported.getURI());
-      if (!protobufs.isProto2(resources.rootOf(imported))) {
-        hasNonProto2 = true;
+      Resource imported = imports.importedResource(anImport);
+      if (imported == null) {
+        continue;
+      }
+      Protobuf importedRoot = resources.rootOf(imported);
+      isProto2 = alreadyChecked.get(importedRoot);
+      if (isProto2 != null) {
+        // resource was already checked.
+        if (isProto2 == IsProto2.NO) {
+          hasNonProto2Imports = true;
+          warnNonProto2ImportFoundIn(anImport);
+        }
+        continue;
+      }
+      if (!protobufs.isProto2(importedRoot)) {
+        alreadyChecked.put(importedRoot, IsProto2.NO);
+        hasNonProto2Imports = true;
         warnNonProto2ImportFoundIn(anImport);
         continue;
       }
-      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> alreadyChecked, ResourceSet resourceSet) {
-    Protobuf root = resources.rootOf(toCheck.getSecond());
-    if (!protobufs.isProto2(root)) {
-      return false;
-    }
-    List<Pair<Import, Resource>> resourcesToCheck = newArrayList();
-    for (Import anImport : protobufs.importsIn(root)) {
-      Resource imported = importedResource(resourceSet, anImport);
-      if (alreadyChecked.contains(imported.getURI())) {
+      // we have a circular dependency
+      if (currentlyChecking.contains(importedRoot)) {
         continue;
       }
-      if (!protobufs.isProto2(resources.rootOf(imported))) {
-        return true;
-      }
-      resourcesToCheck.add(pair(toCheck.getFirst(), imported));
+      // this is a proto2 file. Need to check its imports.
+      importsToCheck.add(pair(anImport, importedRoot));
     }
-    for (Pair<Import, Resource> p : resourcesToCheck) {
-      if (hasNonProto2(p, alreadyChecked, resourceSet)) {
-        return true;
+    for (Pair<Import, Protobuf> importToCheck : importsToCheck) {
+      if (hasNonProto2Imports(importToCheck.getSecond(), currentlyChecking, alreadyChecked)) {
+        hasNonProto2Imports = true;
+        warnNonProto2ImportFoundIn(importToCheck.getFirst());
       }
     }
-    return false;
-  }
-
-  private Resource importedResource(ResourceSet resourceSet, Import anImport) {
-    URI resolvedUri = imports.resolvedUriOf(anImport);
-    if (resolvedUri != null) {
-      return resourceSets.findResource(resourceSet, resolvedUri);
-    }
-    return null;
+    isProto2 = hasNonProto2Imports ? IsProto2.NO : IsProto2.YES;
+    alreadyChecked.put(root, isProto2);
+    currentlyChecking.remove(root);
+    return hasNonProto2Imports;
   }
 
   private void warnNonProto2ImportFoundIn(Import anImport) {
-    acceptWarning(importingNonProto2, anImport, IMPORT__IMPORT_URI, INSIGNIFICANT_INDEX, null);
+    warning(importingNonProto2, anImport, IMPORT__IMPORT_URI, INSIGNIFICANT_INDEX);
   }
 
   /**
@@ -132,4 +120,8 @@
       error(format(importNotFound, anImport.getImportURI()), IMPORT__IMPORT_URI);
     }
   }
+
+  private static enum IsProto2 {
+    YES, NO;
+  }
 }
