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 3d24d80..43af49e 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
@@ -12,13 +12,14 @@
 import static com.google.eclipse.protobuf.util.Strings.*;
 import static org.eclipse.xtext.util.Strings.*;
 
+import org.eclipse.emf.common.util.URI;
+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.scoping.ProtoDescriptorProvider;
 import com.google.inject.Inject;
 
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.xtext.nodemodel.INode;
-
 /**
  * Utility methods related to imports.
  *
@@ -27,6 +28,7 @@
 public class Imports {
   @Inject private ProtoDescriptorProvider descriptorProvider;
   @Inject private INodes nodes;
+  @Inject private ImportUriResolver uriResolver;
 
   /**
    * Indicates whether the URI of the given {@code Import} is equal to the path of the file "descriptor.proto."
@@ -94,4 +96,14 @@
     }
     return false;
   }
+
+  /**
+   * 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.
+   */
+  public URI resolvedUriOf(Import anImport) {
+    String resolvedUri = uriResolver.apply(anImport);
+    return (isEmpty(resolvedUri)) ? null : URI.createURI(resolvedUri);
+  }
 }
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Resources.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Resources.java
index 1627d2c..b159fb2 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Resources.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Resources.java
@@ -8,44 +8,23 @@
  */
 package com.google.eclipse.protobuf.model.util;
 
-import static org.eclipse.emf.common.util.URI.createURI;
 import static org.eclipse.emf.ecore.util.EcoreUtil.getAllContents;
 
-import org.eclipse.emf.common.util.*;
+import org.eclipse.emf.common.util.TreeIterator;
 import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.*;
+import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.xtext.parser.IParseResult;
 import org.eclipse.xtext.resource.XtextResource;
-import org.eclipse.xtext.scoping.impl.ImportUriResolver;
 
-import com.google.eclipse.protobuf.protobuf.*;
-import com.google.inject.Inject;
+import com.google.eclipse.protobuf.protobuf.Protobuf;
+import com.google.inject.Singleton;
 
 /**
  * Utility methods related to <code>{@link Resource}</code>
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
-public class Resources {
-  @Inject private ImportUriResolver uriResolver;
-
-  /**
-   * Finds in the given <code>{@link ResourceSet}</code> the resource referred by the URI of the given import.
-   * @param anImport the given import.
-   * @param resourceSet a collection of resources.
-   * @return the resource referred by the URI of the given import, or {@code null} is the given {@code ResourceSet} does
-   * not contain the resource.
-   */
-  // TODO move to class ResourceSets
-  public Resource importedResource(Import anImport, ResourceSet resourceSet) {
-    try {
-      URI importUri = createURI(uriResolver.apply(anImport));
-      return resourceSet.getResource(importUri, true);
-    } catch (Throwable t) {
-      return null;
-    }
-  }
-
+@Singleton public class Resources {
   /**
    * Returns the root element of the given resource.
    * @param resource the given resource.
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/resource/ResourceSets.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/resource/ResourceSets.java
new file mode 100644
index 0000000..cb0c78f
--- /dev/null
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/resource/ResourceSets.java
@@ -0,0 +1,37 @@
+/*
+ * 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.resource;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.*;
+
+import com.google.inject.Singleton;
+
+/**
+ * Utility methods related to <code>{@link ResourceSet}</code>s.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+@Singleton public class ResourceSets {
+
+  /**
+   * Finds in the given <code>{@link ResourceSet}</code> the resource referred by the given URI.
+   * @param resourceSet a collection of resources.
+   * @param uri the given URI.
+   * @return the resource referred by the given URI, or {@code null} is the given {@code ResourceSet} does
+   * not contain the resource.
+   */
+  public Resource findResource(ResourceSet resourceSet, URI uri) {
+    try {
+      return resourceSet.getResource(uri, true);
+    } catch (Throwable t) {
+      return null;
+    }
+  }
+}
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ModelElementFinder.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ModelElementFinder.java
index 19c53b3..53fa8bc 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ModelElementFinder.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ModelElementFinder.java
@@ -14,7 +14,7 @@
 
 import java.util.*;
 
-import org.eclipse.emf.common.util.TreeIterator;
+import org.eclipse.emf.common.util.*;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.resource.*;
 import org.eclipse.xtext.resource.IEObjectDescription;
@@ -22,6 +22,7 @@
 import com.google.eclipse.protobuf.model.util.*;
 import com.google.eclipse.protobuf.protobuf.*;
 import com.google.eclipse.protobuf.protobuf.Package;
+import com.google.eclipse.protobuf.resource.ResourceSets;
 import com.google.inject.Inject;
 
 /**
@@ -33,6 +34,7 @@
   @Inject private Packages packages;
   @Inject private Protobufs protobufs;
   @Inject private Resources resources;
+  @Inject private ResourceSets resourceSets;
 
   Collection<IEObjectDescription> find(EObject start, FinderStrategy finderStrategy, Object criteria) {
     Set<IEObjectDescription> descriptions = newHashSet();
@@ -87,7 +89,11 @@
         descriptions.addAll(finderStrategy.inDescriptor(anImport, criteria));
         continue;
       }
-      Resource imported = resources.importedResource(anImport, resourceSet);
+      URI resolvedUri = imports.resolvedUriOf(anImport);
+      if (resolvedUri == null) {
+        continue;
+      }
+      Resource imported = resourceSets.findResource(resourceSet, resolvedUri);
       if (imported == null) {
         continue;
       }
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 b71b73e..9f978ac 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
@@ -15,9 +15,7 @@
 import static java.lang.String.format;
 import static org.eclipse.xtext.util.Tuples.pair;
 
-import com.google.eclipse.protobuf.model.util.*;
-import com.google.eclipse.protobuf.protobuf.*;
-import com.google.inject.Inject;
+import java.util.*;
 
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.resource.*;
@@ -25,7 +23,10 @@
 import org.eclipse.xtext.util.Pair;
 import org.eclipse.xtext.validation.*;
 
-import java.util.*;
+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;
 
 /**
  * Verifies that "imports" contain correct values.
@@ -36,6 +37,7 @@
   @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) {}
@@ -60,7 +62,7 @@
     Set<URI> checked = newHashSet();
     checked.add(resource.getURI());
     for (Import anImport : protobufs.importsIn(root)) {
-      Resource imported = resources.importedResource(anImport, resourceSet);
+      Resource imported = importedResource(resourceSet, anImport);
       checked.add(imported.getURI());
       if (!protobufs.isProto2(resources.rootOf(imported))) {
         hasNonProto2 = true;
@@ -87,7 +89,7 @@
     }
     List<Pair<Import, Resource>> resourcesToCheck = newArrayList();
     for (Import anImport : protobufs.importsIn(root)) {
-      Resource imported = resources.importedResource(anImport, resourceSet);
+      Resource imported = importedResource(resourceSet, anImport);
       if (alreadyChecked.contains(imported.getURI())) {
         continue;
       }
@@ -104,6 +106,14 @@
     return false;
   }
 
+  private Resource importedResource(ResourceSet resourceSet, Import anImport) {
+    URI resolvedUri = imports.resolvedUriOf(anImport);
+    if (resolvedUri != null) {
+      return resourceSets.findResource(resourceSet, resolvedUri);
+    }
+    return null;
+  }
+
   private void warnNonProto2ImportFoundIn(Import anImport) {
     acceptWarning(importingNonProto2, anImport, IMPORT__IMPORT_URI, INSIGNIFICANT_INDEX, null);
   }
