diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategies.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategies.java
index 7a84aef..8b9c2b6 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategies.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategies.java
@@ -9,8 +9,8 @@
 package com.google.eclipse.protobuf.ui.scoping;
 
 import static com.google.eclipse.protobuf.ui.preferences.paths.PathResolutionType.*;
-import static com.google.inject.internal.Maps.newHashMap;
 
+import java.util.HashMap;
 import java.util.Map;
 
 import com.google.eclipse.protobuf.ui.preferences.paths.PathResolutionType;
@@ -24,11 +24,12 @@
 @Singleton
 class FileResolverStrategies {
 
-  private final Map<PathResolutionType, FileResolverStrategy> strategies = newHashMap();
+  private final Map<PathResolutionType, FileResolverStrategy> strategies = 
+      new HashMap<PathResolutionType, FileResolverStrategy>();
 
-  @Inject FileResolverStrategies(Resources resources) {
+  @Inject FileResolverStrategies(PathMapping mapping, Resources resources) {
     strategies.put(SINGLE_DIRECTORY, new SingleDirectoryFileResolver(resources));
-    strategies.put(MULTIPLE_DIRECTORIES, new MultipleDirectoriesFileResolver(resources));
+    strategies.put(MULTIPLE_DIRECTORIES, new MultipleDirectoriesFileResolver(mapping, resources));
   }
 
   FileResolverStrategy strategyFor(PathResolutionType type) {
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/MultipleDirectoriesFileResolver.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/MultipleDirectoriesFileResolver.java
index f07108f..0e5c309 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/MultipleDirectoriesFileResolver.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/MultipleDirectoriesFileResolver.java
@@ -8,6 +8,8 @@
  */
 package com.google.eclipse.protobuf.ui.scoping;
 
+import java.util.List;
+
 import org.eclipse.core.filesystem.*;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.Path;
@@ -22,35 +24,44 @@
  */
 class MultipleDirectoriesFileResolver implements FileResolverStrategy {
 
+  private final PathMapping mapping;
   private final Resources resources;
 
-  MultipleDirectoriesFileResolver(Resources resources) {
+  MultipleDirectoriesFileResolver(PathMapping mapping, Resources resources) {
+    this.mapping = mapping;
     this.resources = resources;
   }
 
   /** {@inheritDoc} */
   public String resolveUri(String importUri, URI declaringResourceUri, PathsPreferences preferences) {
-    for (DirectoryPath directoryPath : preferences.directoryPaths()) {
+    List<DirectoryPath> directoryPaths = preferences.directoryPaths();
+    for (DirectoryPath directoryPath : directoryPaths) {
       String resolved = resolveUri(importUri, directoryPath);
       if (resolved != null) return resolved;
     }
+    for (DirectoryPath directoryPath : directoryPaths) {
+      if (!directoryPath.isWorkspacePath()) continue;
+      String resolved = resolveUriFileSystem(importUri, mapping.folderLocation(directoryPath.value()));
+      if (resolved != null) return resolved;
+    }
     return null;
   }
 
-  private String resolveUri(String importUri, DirectoryPath directoryPath) {
-    if (directoryPath.isWorkspacePath()) return resolveUriInWorkspace(importUri, directoryPath.value());
-    return resolveUriFileSystem(importUri, directoryPath.value());
+  private String resolveUri(String importUri, DirectoryPath importRoot) {
+    String root = importRoot.value();
+    if (importRoot.isWorkspacePath()) return resolveUriInWorkspace(importUri, root);
+    return resolveUriFileSystem(importUri, root);
   }
 
-  private String resolveUriInWorkspace(String importUri, String directoryPath) {
-    String path = PREFIX + directoryPath + SEPARATOR + importUri;
+  private String resolveUriInWorkspace(String importUri, String importRoot) {
+    String path = PREFIX + importRoot + SEPARATOR + importUri;
     boolean exists = resources.fileExists(URI.createURI(path));
     return (exists) ? path : null;
   }
 
-  private String resolveUriFileSystem(String importUri, String directoryPath) {
+  private String resolveUriFileSystem(String importUri, String importRoot) {
     IFileSystem fileSystem = EFS.getLocalFileSystem();
-    IPath path = new Path(directoryPath + SEPARATOR + importUri);
+    IPath path = new Path(importRoot + SEPARATOR + importUri);
     IFileInfo fileInfo = fileSystem.getStore(path).fetchInfo();
     if (!fileInfo.exists()) return null;
     return URIUtil.toURI(path).toString();
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/PathMapping.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/PathMapping.java
new file mode 100644
index 0000000..4bcab10
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/PathMapping.java
@@ -0,0 +1,38 @@
+/*
+ * 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.ui.scoping;
+
+import org.eclipse.core.resources.*;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.xtext.util.SimpleCache;
+
+import com.google.common.base.Function;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+class PathMapping {
+
+  private final SimpleCache<String, String> folderPathMapping = new SimpleCache<String, String>(new FolderPathMapper());
+  
+  String folderLocation(String workspacePath) {
+    return folderPathMapping.get(workspacePath);
+  }
+
+  private static class FolderPathMapper implements Function<String, String> {
+    public String apply(String workspacePath) {
+      return folder(workspacePath).getLocation().toOSString();
+    }
+
+    private static IFolder folder(String workspacePath) {
+      IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+      return root.getFolder(new Path(workspacePath));
+    }
+  }
+}
