diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/scoping/FileUriResolver_resolveUri_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/scoping/FileUriResolver_resolveUri_Test.java
index bd05dac..7cba64e 100644
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/scoping/FileUriResolver_resolveUri_Test.java
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/scoping/FileUriResolver_resolveUri_Test.java
@@ -85,7 +85,7 @@
   }
 
   private void callStubs(FileResolutionType type, boolean resolvedUriExists) {
-    when(resources.project(resource)).thenReturn(project);
+    when(resources.project(resource.getURI())).thenReturn(project);
     when(preferenceReader.readFromPrefereceStore(project)).thenReturn(preferences);
     when(preferences.fileResolutionType()).thenReturn(type);
     when(resources.fileExists(any(URI.class))).thenReturn(resolvedUriExists);
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileUriResolver.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileUriResolver.java
index e5e6491..d3659fa 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileUriResolver.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileUriResolver.java
@@ -15,6 +15,8 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.xtext.util.Pair;
@@ -29,6 +31,7 @@
  */
 public class FileUriResolver implements IFileUriResolver {
   
+  private static final String PREFIX = "platform:/resource";
   private static final String SEPARATOR = "/";
 
   @Inject private PreferenceReader preferenceReader;
@@ -52,23 +55,22 @@
   public String resolveUri(String importUri, Resource declaringResource) {
     if (importUri.startsWith(PREFIX)) return importUri;
     Pair<String, List<String>> importUriPair = pair(importUri, createURI(importUri).segmentsList());
-    Preferences preferences = preferenceReader.readFromPrefereceStore(resources.project(declaringResource));
-    URI resourceUri = declaringResource.getURI();
-    String fixed = resolveUri(importUriPair, resourceUri, preferences);
-    System.out.println(resourceUri + " : " + importUri + " : " + fixed);
-    if (fixed == null) return importUri;
-    return fixed;
+    String resolved = resolveUri(importUriPair, declaringResource.getURI());
+//    System.out.println(declaringResource.getURI() + " : " + importUri + " : " + resolved);
+    if (resolved == null) return importUri;
+    return resolved;
   }
   
-  private String resolveUri(Pair<String, List<String>> importUri, URI resourceUri, Preferences preferences) {
+  private String resolveUri(Pair<String, List<String>> importUri, URI resourceUri) {
+    IProject project = resources.project(resourceUri);
+    Preferences preferences = preferenceReader.readFromPrefereceStore(project);
     List<String> segments = removeFirstAndLast(resourceUri.segmentsList());
     if (preferences.fileResolutionType().equals(SINGLE_FOLDER)) {
       return resolveUri(importUri, segments);
     }
     for (String folderName : preferences.folderNames()) {
-      segments.set(1, folderName);
-      String fixed = resolveUri(importUri, segments);
-      if (fixed != null) return fixed;
+      String resolved = resolveUri(importUri, folderName, project);
+      if (resolved != null) return resolved;
     }
     return null;
   }
@@ -82,16 +84,20 @@
   }
   
   private String resolveUri(Pair<String, List<String>> importUri, List<String> resourceUri) {
-    StringBuilder prefix = new StringBuilder();
-    // prefix.append(PREFIX);
+    StringBuilder pathBuilder = new StringBuilder();
     String firstSegment = importUri.getSecond().get(0);
     for (String segment : resourceUri) {
       if (segment.equals(firstSegment)) break;
-      prefix.append(SEPARATOR).append(segment);
+      pathBuilder.append(segment).append(SEPARATOR);
     }
-    prefix.append(SEPARATOR);
-    String fixed = PREFIX + prefix.toString() + importUri.getFirst();
-    if (resources.fileExists(createURI(fixed))) return fixed;
-    return null;
+    String resolved = PREFIX + SEPARATOR + pathBuilder.toString() + importUri.getFirst();
+    return (resources.fileExists(createURI(resolved))) ? resolved : null;
+  }
+  
+  private String resolveUri(Pair<String, List<String>> importUri, String folderName, IProject project) {
+    String path = folderName + SEPARATOR + importUri.getFirst();
+    IResource findMember = project.findMember(path);
+    boolean exists = (findMember != null) ? findMember.exists() : false;
+    return (exists) ? PREFIX +  project.getFullPath() + SEPARATOR + path : null;
   }
 }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/Resources.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/Resources.java
index 876f0d4..2839af5 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/Resources.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/Resources.java
@@ -12,7 +12,6 @@
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
 
 /**
  * Utility methods related to resources (e.g. files, directories.)
@@ -22,12 +21,12 @@
 public class Resources {
 
   /**
-   * Returns the project that contains the given resource.
-   * @param resource the given resource.
-   * @return the project that contains the given resource.
+   * Returns the project that contains the resource at the given URI.
+   * @param resourceUri the given URI.
+   * @return the project that contains the resource at the given URI.
    */
-  public IProject project(Resource resource) {
-    return file(resource.getURI()).getProject();
+  public IProject project(URI resourceUri) {
+    return file(resourceUri).getProject();
   }
   
   /**
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IFileUriResolver.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IFileUriResolver.java
index 1c0a857..58257de 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IFileUriResolver.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IFileUriResolver.java
@@ -21,9 +21,6 @@
 @ImplementedBy(NullFileUriResolver.class)
 public interface IFileUriResolver {
 
-  /** Prefix present in resolved URIs. */
-  String PREFIX = "platform:/resource";
-  
   /**
    * Resolves the given partial URI.
    * @param importUri the partial URI (comes from a {@code Import}.)
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufImportUriResolver.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufImportUriResolver.java
index d0e2a67..4fdd459 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufImportUriResolver.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufImportUriResolver.java
@@ -8,8 +8,6 @@
  */
 package com.google.eclipse.protobuf.scoping;
 
-import static com.google.eclipse.protobuf.scoping.IFileUriResolver.PREFIX;
-
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.xtext.scoping.impl.ImportUriResolver;
 
@@ -32,11 +30,6 @@
   @Inject private IFileUriResolver delegate;
 
   /**
-   * Prefix used by EMF for resource URIs: "platform:/resource/".
-   */
-  public static final String URI_PREFIX = PREFIX + "/";
-
-  /**
    * If the given {@code EObject} is a <code>{@link Import}</code>, this method will add "platform:/resource" to the
    * URI of such import if not specified already.
    * @param from the given element to resolve.
@@ -45,10 +38,10 @@
   @Override public String apply(EObject from) {
     if (from instanceof Import) {
       Import anImport = (Import) from;
-      String originalUri = anImport.getImportURI();
+      // String originalUri = anImport.getImportURI();
       anImport.setImportURI(resolveImportUri(anImport));
       String applied = super.apply(from);
-      anImport.setImportURI(originalUri);
+      // anImport.setImportURI(originalUri);
       return applied;
     }
     if (from instanceof Import) resolveImportUri((Import) from);
