diff --git a/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/stubs/FileStub.java b/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/stubs/FileStub.java
index e6dcec0..d3b036d 100644
--- a/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/stubs/FileStub.java
+++ b/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/stubs/FileStub.java
@@ -28,38 +28,38 @@
   private final Map<String, List<MarkerStub>> markersByType = new HashMap<String, List<MarkerStub>>();
 
   /** {@inheritDoc} */
-  public void accept(IResourceProxyVisitor visitor, int memberFlags) throws CoreException {
+  public void accept(IResourceProxyVisitor visitor, int memberFlags) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void accept(IResourceVisitor visitor) throws CoreException {
+  public void accept(IResourceVisitor visitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void accept(IResourceVisitor visitor, int depth, boolean includePhantoms) throws CoreException {
+  public void accept(IResourceVisitor visitor, int depth, boolean includePhantoms) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void accept(IResourceVisitor visitor, int depth, int memberFlags) throws CoreException {
+  public void accept(IResourceVisitor visitor, int depth, int memberFlags) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
   public void appendContents(InputStream source, boolean force, boolean keepHistory, IProgressMonitor monitor)
-      throws CoreException {
+      {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void appendContents(InputStream source, int updateFlags, IProgressMonitor monitor) throws CoreException {
+  public void appendContents(InputStream source, int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void clearHistory(IProgressMonitor monitor) throws CoreException {
+  public void clearHistory(IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
@@ -69,47 +69,47 @@
   }
 
   /** {@inheritDoc} */
-  public void copy(IPath destination, boolean force, IProgressMonitor monitor) throws CoreException {
+  public void copy(IPath destination, boolean force, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void copy(IPath destination, int updateFlags, IProgressMonitor monitor) throws CoreException {
+  public void copy(IPath destination, int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void copy(IProjectDescription description, boolean force, IProgressMonitor monitor) throws CoreException {
+  public void copy(IProjectDescription description, boolean force, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void copy(IProjectDescription description, int updateFlags, IProgressMonitor monitor) throws CoreException {
+  public void copy(IProjectDescription description, int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void create(InputStream source, boolean force, IProgressMonitor monitor) throws CoreException {
+  public void create(InputStream source, boolean force, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void create(InputStream source, int updateFlags, IProgressMonitor monitor) throws CoreException {
+  public void create(InputStream source, int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void createLink(IPath localLocation, int updateFlags, IProgressMonitor monitor) throws CoreException {
+  public void createLink(IPath localLocation, int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void createLink(URI location, int updateFlags, IProgressMonitor monitor) throws CoreException {
+  public void createLink(URI location, int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public IMarker createMarker(String type) throws CoreException {
+  public IMarker createMarker(String type) {
     MarkerStub marker = new MarkerStub(type);
     addMarker(marker);
     return marker;
@@ -121,22 +121,22 @@
   }
 
   /** {@inheritDoc} */
-  public void delete(boolean force, boolean keepHistory, IProgressMonitor monitor) throws CoreException {
+  public void delete(boolean force, boolean keepHistory, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void delete(boolean force, IProgressMonitor monitor) throws CoreException {
+  public void delete(boolean force, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void delete(int updateFlags, IProgressMonitor monitor) throws CoreException {
+  public void delete(int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void deleteMarkers(String type, boolean includeSubtypes, int depth) throws CoreException {
+  public void deleteMarkers(String type, boolean includeSubtypes, int depth) {
     List<MarkerStub> markers = markersByType.get(type);
     if (markers != null) markers.clear();
   }
@@ -147,19 +147,19 @@
   }
 
   /** {@inheritDoc} */
-  public IMarker findMarker(long id) throws CoreException {
+  public IMarker findMarker(long id) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public IMarker[] findMarkers(String type, boolean includeSubtypes, int depth) throws CoreException {
+  public IMarker[] findMarkers(String type, boolean includeSubtypes, int depth) {
     List<MarkerStub> markers = markersByType.get(type);
     if (markers == null) return new IMarker[0];
     return markers.toArray(new IMarker[markers.size()]);
   }
 
   /** {@inheritDoc} */
-  public int findMaxProblemSeverity(String type, boolean includeSubtypes, int depth) throws CoreException {
+  public int findMaxProblemSeverity(String type, boolean includeSubtypes, int depth) {
     throw new UnsupportedOperationException();
   }
 
@@ -169,37 +169,37 @@
   }
 
   /** {@inheritDoc} */
-  public String getCharset() throws CoreException {
+  public String getCharset() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public String getCharset(boolean checkImplicit) throws CoreException {
+  public String getCharset(boolean checkImplicit) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public String getCharsetFor(Reader reader) throws CoreException {
+  public String getCharsetFor(Reader reader) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public IContentDescription getContentDescription() throws CoreException {
+  public IContentDescription getContentDescription() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public InputStream getContents() throws CoreException {
+  public InputStream getContents() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public InputStream getContents(boolean force) throws CoreException {
+  public InputStream getContents(boolean force) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public int getEncoding() throws CoreException {
+  @Deprecated public int getEncoding() {
     throw new UnsupportedOperationException();
   }
 
@@ -214,7 +214,7 @@
   }
 
   /** {@inheritDoc} */
-  public IFileState[] getHistory(IProgressMonitor monitor) throws CoreException {
+  public IFileState[] getHistory(IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
@@ -259,12 +259,12 @@
   }
 
   /** {@inheritDoc} */
-  public Map<QualifiedName, String> getPersistentProperties() throws CoreException {
+  public Map<QualifiedName, String> getPersistentProperties() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public String getPersistentProperty(QualifiedName key) throws CoreException {
+  public String getPersistentProperty(QualifiedName key) {
     throw new UnsupportedOperationException();
   }
 
@@ -294,12 +294,12 @@
   }
 
   /** {@inheritDoc} */
-  public Map<QualifiedName, Object> getSessionProperties() throws CoreException {
+  public Map<QualifiedName, Object> getSessionProperties() {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public Object getSessionProperty(QualifiedName key) throws CoreException {
+  public Object getSessionProperty(QualifiedName key) {
     throw new UnsupportedOperationException();
   }
 
@@ -354,7 +354,7 @@
   }
 
   /** {@inheritDoc} */
-  public boolean isLocal(int depth) {
+  @Deprecated public boolean isLocal(int depth) {
     throw new UnsupportedOperationException();
   }
 
@@ -390,125 +390,125 @@
 
   /** {@inheritDoc} */
   public void move(IPath destination, boolean force, boolean keepHistory, IProgressMonitor monitor)
-      throws CoreException {
+      {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void move(IPath destination, boolean force, IProgressMonitor monitor) throws CoreException {
+  public void move(IPath destination, boolean force, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void move(IPath destination, int updateFlags, IProgressMonitor monitor) throws CoreException {
+  public void move(IPath destination, int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
   public void move(IProjectDescription description, boolean force, boolean keepHistory, IProgressMonitor monitor)
-      throws CoreException {
+      {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void move(IProjectDescription description, int updateFlags, IProgressMonitor monitor) throws CoreException {
+  public void move(IProjectDescription description, int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void refreshLocal(int depth, IProgressMonitor monitor) throws CoreException {
+  public void refreshLocal(int depth, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void revertModificationStamp(long value) throws CoreException {
+  public void revertModificationStamp(long value) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setCharset(String newCharset) throws CoreException {
+  @Deprecated public void setCharset(String newCharset) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setCharset(String newCharset, IProgressMonitor monitor) throws CoreException {
+  public void setCharset(String newCharset, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
   public void setContents(IFileState source, boolean force, boolean keepHistory, IProgressMonitor monitor)
-      throws CoreException {
+      {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setContents(IFileState source, int updateFlags, IProgressMonitor monitor) throws CoreException {
+  public void setContents(IFileState source, int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
   public void setContents(InputStream source, boolean force, boolean keepHistory, IProgressMonitor monitor)
-      throws CoreException {
+      {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setContents(InputStream source, int updateFlags, IProgressMonitor monitor) throws CoreException {
+  public void setContents(InputStream source, int updateFlags, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setDerived(boolean isDerived) throws CoreException {
+  @Deprecated public void setDerived(boolean isDerived) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setDerived(boolean isDerived, IProgressMonitor monitor) throws CoreException {
+  public void setDerived(boolean isDerived, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setHidden(boolean isHidden) throws CoreException {
+  public void setHidden(boolean isHidden) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setLocal(boolean flag, int depth, IProgressMonitor monitor) throws CoreException {
+  @Deprecated public void setLocal(boolean flag, int depth, IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public long setLocalTimeStamp(long value) throws CoreException {
+  public long setLocalTimeStamp(long value) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setPersistentProperty(QualifiedName key, String value) throws CoreException {
+  public void setPersistentProperty(QualifiedName key, String value) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setReadOnly(boolean readOnly) {
+  @Deprecated public void setReadOnly(boolean readOnly) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setResourceAttributes(ResourceAttributes attributes) throws CoreException {
+  public void setResourceAttributes(ResourceAttributes attributes) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setSessionProperty(QualifiedName key, Object value) throws CoreException {
+  public void setSessionProperty(QualifiedName key, Object value) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setTeamPrivateMember(boolean isTeamPrivate) throws CoreException {
+  public void setTeamPrivateMember(boolean isTeamPrivate) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void touch(IProgressMonitor monitor) throws CoreException {
+  public void touch(IProgressMonitor monitor) {
     throw new UnsupportedOperationException();
   }
 
@@ -523,7 +523,7 @@
     return unmodifiableList(markers);
   }
 
-  public void addMarker(MarkerStub marker) throws CoreException {
+  public void addMarker(MarkerStub marker) {
     String type = marker.getType();
     List<MarkerStub> markers = markersByType.get(type);
     if (markers == null) {
diff --git a/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/stubs/MarkerStub.java b/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/stubs/MarkerStub.java
index ee384e6..8386a8a 100644
--- a/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/stubs/MarkerStub.java
+++ b/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/stubs/MarkerStub.java
@@ -1,6 +1,9 @@
 /*
- * 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
+ * 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;
@@ -11,7 +14,6 @@
 
 import org.eclipse.core.resources.IMarker;
 import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
@@ -22,7 +24,7 @@
   private final String type;
   private final long creationTime;
 
-  public static MarkerStub error(String type, String description, int lineNumber) throws CoreException {
+  public static MarkerStub error(String type, String description, int lineNumber) {
     MarkerStub marker = new MarkerStub(type);
     marker.setAttribute(SEVERITY, SEVERITY_ERROR);
     marker.setAttribute(MESSAGE, description);
@@ -41,7 +43,7 @@
   }
 
   /** {@inheritDoc} */
-  public void delete() throws CoreException {
+  public void delete() {
     throw new UnsupportedOperationException();
   }
 
@@ -51,7 +53,7 @@
   }
 
   /** {@inheritDoc} */
-  public Object getAttribute(String attributeName) throws CoreException {
+  public Object getAttribute(String attributeName) {
     return attributes.get(attributeName);
   }
 
@@ -77,12 +79,12 @@
   }
 
   /** {@inheritDoc} */
-  public Map<String, Object> getAttributes() throws CoreException {
+  public Map<String, Object> getAttributes() {
     return unmodifiableMap(attributes);
   }
 
   /** {@inheritDoc} */
-  public Object[] getAttributes(String[] attributeNames) throws CoreException {
+  public Object[] getAttributes(String[] attributeNames) {
     List<Object> values = new ArrayList<Object>();
     for (String name : attributeNames)
       values.add(attributes.get(name));
@@ -90,7 +92,7 @@
   }
 
   /** {@inheritDoc} */
-  public long getCreationTime() throws CoreException {
+  public long getCreationTime() {
     return creationTime;
   }
 
@@ -105,49 +107,49 @@
   }
 
   /** {@inheritDoc} */
-  public String getType() throws CoreException {
+  public String getType() {
     return type;
   }
 
   /** {@inheritDoc} */
-  public boolean isSubtypeOf(String superType) throws CoreException {
+  public boolean isSubtypeOf(String superType) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setAttribute(String attributeName, int value) throws CoreException {
+  public void setAttribute(String attributeName, int value) {
     attributes.put(attributeName, value);
   }
 
   /** {@inheritDoc} */
-  public void setAttribute(String attributeName, Object value) throws CoreException {
+  public void setAttribute(String attributeName, Object value) {
     attributes.put(attributeName, value);
   }
 
   /** {@inheritDoc} */
-  public void setAttribute(String attributeName, boolean value) throws CoreException {
+  public void setAttribute(String attributeName, boolean value) {
     attributes.put(attributeName, value);
   }
 
   /** {@inheritDoc} */
-  public void setAttributes(String[] attributeNames, Object[] values) throws CoreException {
+  public void setAttributes(String[] attributeNames, Object[] values) {
     throw new UnsupportedOperationException();
   }
 
   /** {@inheritDoc} */
-  public void setAttributes(Map<String, ? extends Object> attributes) throws CoreException {
+  public void setAttributes(Map<String, ? extends Object> attributes) {
     this.attributes.putAll(attributes);
   }
 
-  public int severity() throws CoreException {
+  public int severity() {
     return getAttribute(SEVERITY, -1);
   }
   
-  public String message() throws CoreException {
+  public String message() {
     return (String) getAttribute(MESSAGE);
   }
 
-  public int lineNumber() throws CoreException {
+  public int lineNumber() {
     return getAttribute(LINE_NUMBER, -1);
   }
 
diff --git a/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/stubs/ResourceStub.java b/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/stubs/ResourceStub.java
new file mode 100644
index 0000000..3da6b23
--- /dev/null
+++ b/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/stubs/ResourceStub.java
@@ -0,0 +1,167 @@
+/*
+ * 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;
+
+import static org.eclipse.emf.common.util.URI.createURI;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Map;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class ResourceStub implements Resource {
+
+  private URI uri;
+
+  public ResourceStub() {}
+  
+  public ResourceStub(String uri) {
+    setURI(createURI(uri));
+  }
+  
+  /** {@inheritDoc} */
+  public EList<Adapter> eAdapters() {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public boolean eDeliver() {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void eSetDeliver(boolean deliver) {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void eNotify(Notification notification) {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public ResourceSet getResourceSet() {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public URI getURI() {
+    return uri;
+  }
+
+  /** {@inheritDoc} */
+  public void setURI(URI uri) {
+    this.uri = uri;
+  }
+
+  /** {@inheritDoc} */
+  public long getTimeStamp() {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void setTimeStamp(long timeStamp) {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public EList<EObject> getContents() {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public TreeIterator<EObject> getAllContents() {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public String getURIFragment(EObject eObject) {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public EObject getEObject(String uriFragment) {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void save(Map<?, ?> options) {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void load(Map<?, ?> options) {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void save(OutputStream outputStream, Map<?, ?> options) {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void load(InputStream inputStream, Map<?, ?> options) {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public boolean isTrackingModification() {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void setTrackingModification(boolean isTrackingModification) {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public boolean isModified() {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void setModified(boolean isModified) {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public boolean isLoaded() {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void unload() {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public void delete(Map<?, ?> options) {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public EList<Diagnostic> getErrors() {
+    throw new UnsupportedOperationException();
+  }
+
+  /** {@inheritDoc} */
+  public EList<Diagnostic> getWarnings() {
+    throw new UnsupportedOperationException();
+  }
+
+}
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 73a3305..bd05dac 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
@@ -8,14 +8,21 @@
  */
 package com.google.eclipse.protobuf.ui.scoping;
 
-import static org.eclipse.emf.common.util.URI.createURI;
+import static com.google.eclipse.protobuf.ui.preferences.paths.FileResolutionType.SINGLE_FOLDER;
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.*;
 
+import org.eclipse.core.resources.IProject;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.junit.*;
 
 import com.google.eclipse.protobuf.junit.core.XtextRule;
+import com.google.eclipse.protobuf.junit.stubs.ResourceStub;
 import com.google.eclipse.protobuf.scoping.IFileUriResolver;
+import com.google.eclipse.protobuf.ui.preferences.paths.*;
 import com.google.inject.*;
 
 /**
@@ -27,51 +34,60 @@
 
   @Rule public XtextRule xtext = new XtextRule();
   
-  private URI resourceUri;
-  private ResourcesStub resources;
+  private Resource resource;
+  private PreferenceReader preferenceReader;
+  private Preferences preferences;
+  private IProject project;
+  private Resources resources;
+
   private FileUriResolver resolver;
 
   @Before public void setUp() {
-    resources = new ResourcesStub();
-    resources.resourceShouldAlwaysExist = true;
+    resource = new ResourceStub("platform:/resource/src/proto/person.proto");
+    preferenceReader = mock(PreferenceReader.class);
+    preferences = mock(Preferences.class);
+    project = mock(IProject.class);
+    resources = mock(Resources.class);
     Module module = new Module() {
       public void configure(Binder binder) {
+        binder.bind(PreferenceReader.class).toInstance(preferenceReader);
         binder.bind(Resources.class).toInstance(resources);
         binder.bind(IFileUriResolver.class).to(FileUriResolver.class);
       }
     };
     Injector injector = xtext.injector().createChildInjector(module);
-    resourceUri = createURI("platform:/resource/src/proto/person.proto");
     resolver = (FileUriResolver) injector.getInstance(IFileUriResolver.class);
   }
 
   @Test public void should_resolve_import_URI_if_missing_scheme() {
-    resolver.resolveUri("folder1/address.proto", null);
-//    String uri = resolver.resolveUri("folder1/address.proto", resourceUri);
-//    assertThat(uri, equalTo("platform:/resource/src/proto/folder1/address.proto"));  
+    callStubs(SINGLE_FOLDER, true);
+    String resolved = resolver.resolveUri("folder1/address.proto", resource);
+    assertThat(resolved, equalTo("platform:/resource/src/proto/folder1/address.proto"));  
   }
-//
-//  @Test public void should_not_resolve_import_URI_if_not_missing_scheme() {
-//    String originalUri = "platform:/resource/src/proto/folder1/address.proto";
-//    String uri = resolver.resolveUri(originalUri, resourceUri, resources);
-//    assertThat(uri, equalTo(originalUri));
-//  }
-//  
-//  @Test public void should_resolve_import_URI_even_if_overlapping_folders_with_resource_URI() {
-//    String uri = resolver.resolveUri("src/proto/folder1/address.proto", resourceUri);
-//    assertThat(uri, equalTo("platform:/resource/src/proto/folder1/address.proto"));  
-//  }
-//
-//  @Test public void should_resolve_import_URI_even_if_overlapping_one_folder_only_with_resource_URI() {
-//    String uri = resolver.resolveUri("src/proto/read-only/address.proto", resourceUri);
-//    assertThat(uri, equalTo("platform:/resource/src/proto/read-only/address.proto"));  
-//  }
-//  
-  private static class ResourcesStub extends Resources {
-    boolean resourceShouldAlwaysExist;
-    
-    @Override public boolean fileExists(URI uri) {
-      return resourceShouldAlwaysExist;
-    }
+  
+  @Test public void should_not_resolve_import_URI_if_not_missing_scheme() {
+    callStubs(SINGLE_FOLDER, true);
+    String original = "platform:/resource/src/proto/folder1/address.proto";
+    String resolved = resolver.resolveUri(original, resource);
+    assertThat(resolved, equalTo(original));
+  }
+  
+  @Test public void should_resolve_import_URI_even_if_overlapping_folders_with_resource_URI() {
+    callStubs(SINGLE_FOLDER, true);
+    String resolved = resolver.resolveUri("src/proto/folder1/address.proto", resource);
+    assertThat(resolved, equalTo("platform:/resource/src/proto/folder1/address.proto"));  
+  }
+
+  @Test public void should_resolve_import_URI_even_if_overlapping_one_folder_only_with_resource_URI() {
+    callStubs(SINGLE_FOLDER, true);
+    String resolved = resolver.resolveUri("src/proto/read-only/address.proto", resource);
+    assertThat(resolved, equalTo("platform:/resource/src/proto/read-only/address.proto"));  
+  }
+
+  private void callStubs(FileResolutionType type, boolean resolvedUriExists) {
+    when(resources.project(resource)).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/preferences/paths/PreferenceReader.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PreferenceReader.java
new file mode 100644
index 0000000..3f7cb03
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PreferenceReader.java
@@ -0,0 +1,34 @@
+/*
+ * 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.preferences.paths;
+
+import static com.google.eclipse.protobuf.ui.preferences.paths.PreferenceNames.ENABLE_PROJECT_SETTINGS;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
+
+import com.google.inject.Inject;
+
+/**
+ * Reads "paths" preferences.
+ * 
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class PreferenceReader {
+
+  @Inject private IPreferenceStoreAccess storeAccess;
+  
+  public Preferences readFromPrefereceStore(IProject project) {
+    IPreferenceStore store = storeAccess.getWritablePreferenceStore(project);
+    boolean useProject = store.getBoolean(ENABLE_PROJECT_SETTINGS);
+    if (!useProject) store = storeAccess.getWritablePreferenceStore();
+    return new Preferences(store);
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/Preferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/Preferences.java
index a478679..8613469 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/Preferences.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/Preferences.java
@@ -9,16 +9,14 @@
 package com.google.eclipse.protobuf.ui.preferences.paths;
 
 import static com.google.eclipse.protobuf.ui.preferences.paths.FileResolutionType.SINGLE_FOLDER;
-import static com.google.eclipse.protobuf.ui.preferences.paths.PreferenceNames.*;
+import static com.google.eclipse.protobuf.ui.preferences.paths.PreferenceNames.FOLDER_NAMES;
 import static com.google.eclipse.protobuf.ui.util.Strings.CSV_PATTERN;
 import static java.util.Arrays.asList;
 import static java.util.Collections.*;
 
 import java.util.List;
 
-import org.eclipse.core.resources.IProject;
 import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
 
 /**
  * Paths preferences, retrieved from an <code>{@link IPreferenceStore}</code>.
@@ -27,17 +25,10 @@
  */
 public class Preferences {
 
-  public final FileResolutionType fileResolutionType;
-  public final List<String> folderNames; 
+  private final FileResolutionType fileResolutionType;
+  private final List<String> folderNames; 
   
-  public static Preferences loadPreferences(IPreferenceStoreAccess access, IProject project) {
-    IPreferenceStore store = access.getWritablePreferenceStore(project);
-    boolean useProjectPreferences = store.getBoolean(ENABLE_PROJECT_SETTINGS);
-    if (!useProjectPreferences) store = access.getWritablePreferenceStore();
-    return new Preferences(store);
-  }
-  
-  private Preferences(IPreferenceStore store) {
+  Preferences(IPreferenceStore store) {
     fileResolutionType = FileResolutionType.find(store);
     folderNames = folderNames(fileResolutionType, store);
   }
@@ -47,4 +38,12 @@
     String[] folderNames = store.getString(FOLDER_NAMES).split(CSV_PATTERN);
     return unmodifiableList(asList(folderNames));
   }
+
+  public FileResolutionType fileResolutionType() {
+    return fileResolutionType;
+  }
+
+  public List<String> folderNames() {
+    return folderNames;
+  }
 }
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 5249e26..e5e6491 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
@@ -17,10 +17,10 @@
 
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
 import org.eclipse.xtext.util.Pair;
 
 import com.google.eclipse.protobuf.scoping.IFileUriResolver;
+import com.google.eclipse.protobuf.ui.preferences.paths.PreferenceReader;
 import com.google.eclipse.protobuf.ui.preferences.paths.Preferences;
 import com.google.inject.Inject;
 
@@ -31,7 +31,7 @@
   
   private static final String SEPARATOR = "/";
 
-  @Inject private IPreferenceStoreAccess access;
+  @Inject private PreferenceReader preferenceReader;
   @Inject private Resources resources;
   
   /*
@@ -52,23 +52,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();
-    Preferences preferences = Preferences.loadPreferences(access, resources.project(resourceUri));
-    String fixed = fixUri(importUriPair, resourceUri, preferences);
+    String fixed = resolveUri(importUriPair, resourceUri, preferences);
     System.out.println(resourceUri + " : " + importUri + " : " + fixed);
     if (fixed == null) return importUri;
     return fixed;
   }
   
-  private String fixUri(Pair<String, List<String>> importUri, URI resourceUri, Preferences preferences) {
+  private String resolveUri(Pair<String, List<String>> importUri, URI resourceUri, Preferences preferences) {
     List<String> segments = removeFirstAndLast(resourceUri.segmentsList());
-    if (preferences.fileResolutionType.equals(SINGLE_FOLDER)) {
-      return fixUri(importUri, segments);
+    if (preferences.fileResolutionType().equals(SINGLE_FOLDER)) {
+      return resolveUri(importUri, segments);
     }
-    List<String> folderNames = preferences.folderNames;
-    for (String folderName : folderNames) {
+    for (String folderName : preferences.folderNames()) {
       segments.set(1, folderName);
-      String fixed = fixUri(importUri, segments);
+      String fixed = resolveUri(importUri, segments);
       if (fixed != null) return fixed;
     }
     return null;
@@ -82,7 +81,7 @@
     return newList;
   }
   
-  private String fixUri(Pair<String, List<String>> importUri, List<String> resourceUri) {
+  private String resolveUri(Pair<String, List<String>> importUri, List<String> resourceUri) {
     StringBuilder prefix = new StringBuilder();
     // prefix.append(PREFIX);
     String firstSegment = importUri.getSecond().get(0);
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 b252395..876f0d4 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,6 +12,7 @@
 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.)
@@ -21,12 +22,12 @@
 public class Resources {
 
   /**
-   * Returns the project that contains the resource at the given URI.
-   * @param fileUri the URI of a resource.
-   * @return the project that contains the resource at the given URI.
+   * Returns the project that contains the given resource.
+   * @param resource the given resource.
+   * @return the project that contains the given resource.
    */
-  public IProject project(URI fileUri) {
-    return file(fileUri).getProject();
+  public IProject project(Resource resource) {
+    return file(resource.getURI()).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 044a1a2..1c0a857 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
@@ -32,8 +32,7 @@
    */
   String resolveUri(String importUri, Resource declaringResource);
   
-  public static class NullFileUriResolver implements IFileUriResolver {
-    
+  class NullFileUriResolver implements IFileUriResolver {
     public String resolveUri(String importUri, Resource declaringResource) {
       throw new UnsupportedOperationException();
     }
