diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/DirectoryPath_parse_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/DirectoryPath_parse_Test.java
deleted file mode 100644
index 6ad7726..0000000
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/DirectoryPath_parse_Test.java
+++ /dev/null
@@ -1,34 +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.ui.preferences.pages.paths;
-
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.junit.Assert.*;
-
-import org.junit.Test;
-
-/**
- * Tests for <code>{@link DirectoryPath#parse(String)}</code>
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class DirectoryPath_parse_Test {
-
-  @Test public void should_parse_workspace_path() {
-    DirectoryPath path = DirectoryPath.parse("${workspace_loc:/test/src}");
-    assertThat(path.value(), equalTo("/test/src"));
-    assertTrue(path.isWorkspacePath());
-  }
-
-  @Test public void should_parse_file_system_path() {
-    DirectoryPath path = DirectoryPath.parse("/test/src");
-    assertThat(path.value(), equalTo("/test/src"));
-    assertFalse(path.isWorkspacePath());
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/DirectoryPath_toString_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/DirectoryPath_toString_Test.java
deleted file mode 100644
index eb808f8..0000000
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/DirectoryPath_toString_Test.java
+++ /dev/null
@@ -1,37 +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.ui.preferences.pages.paths;
-
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.junit.Assert.assertThat;
-
-import org.junit.Test;
-
-/**
- * Tests for <code>{@link DirectoryPath#toString()}</code>
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class DirectoryPath_toString_Test {
-
-  @Test public void should_specify_is_workspace_path() {
-    DirectoryPath path = new DirectoryPath("/test/src", true);
-    assertThat(path.toString(), equalTo("${workspace_loc:/test/src}"));
-  }
-
-  @Test public void should_specify_is_project_path() {
-    DirectoryPath path = new DirectoryPath("/${project}/src", true);
-    assertThat(path.toString(), equalTo("${workspace_loc:/${project}/src}"));
-  }
-
-  @Test public void should_return_plain_value_if_it_is_not_workspace_path() {
-    DirectoryPath path = new DirectoryPath("/test/src", false);
-    assertThat(path.toString(), equalTo("/test/src"));
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/ProjectVariable_useProjectName_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/ProjectVariable_useProjectName_Test.java
deleted file mode 100644
index 99606dd..0000000
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/ProjectVariable_useProjectName_Test.java
+++ /dev/null
@@ -1,48 +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.ui.preferences.pages.paths;
-
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.junit.Assert.assertThat;
-import static org.mockito.Mockito.*;
-
-import org.eclipse.core.resources.IProject;
-import org.junit.*;
-
-/**
- * Tests for <code>{@link ProjectVariable#useProjectName(String, IProject)}</code>.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class ProjectVariable_useProjectName_Test {
-
-  private IProject project;
-
-  @Before public void setUp() {
-    project = mock(IProject.class);
-  }
-
-  @Test public void should_use_project_name_if_path_contains_variable() {
-    when(project.getName()).thenReturn("test");
-    String newPath = ProjectVariable.useProjectName("/${project}/src/test", project);
-    assertThat(newPath, equalTo("/test/src/test"));
-  }
-
-  @Test public void should_not_use_project_name_if_path_does_not_contain_variable() {
-    when(project.getName()).thenReturn("test");
-    String newPath = ProjectVariable.useProjectName("/main/src/test", project);
-    assertThat(newPath, equalTo("/main/src/test"));
-  }
-
-  @Test public void should_not_use_project_name_if_path_already_contains_it() {
-    when(project.getName()).thenReturn("test");
-    String newPath = ProjectVariable.useProjectName("/test/src/test", project);
-    assertThat(newPath, equalTo("/test/src/test"));
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/paths/core/DirectoryPath_parse_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/paths/core/DirectoryPath_parse_Test.java
new file mode 100644
index 0000000..68ce183
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/paths/core/DirectoryPath_parse_Test.java
@@ -0,0 +1,49 @@
+/*
+ * 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.core;
+
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.*;
+
+import org.eclipse.core.resources.IProject;
+import org.junit.*;
+
+/**
+ * Tests for <code>{@link DirectoryPath#parse(String, IProject)}</code>
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class DirectoryPath_parse_Test {
+
+  private IProject project;
+
+  @Before public void setUp() {
+    project = mock(IProject.class);
+  }
+
+  @Test public void should_parse_workspace_path() {
+    when(project.getName()).thenReturn("test");
+    DirectoryPath path = DirectoryPath.parse("${workspace_loc:/${project}/src}", project);
+    assertThat(path.value(), equalTo("/test/src"));
+    assertTrue(path.isWorkspacePath());
+  }
+
+  @Test public void should_parse_workspace_path_with_null_IProject() {
+    DirectoryPath path = DirectoryPath.parse("${workspace_loc:/test/src}", null);
+    assertThat(path.value(), equalTo("/test/src"));
+    assertTrue(path.isWorkspacePath());
+  }
+
+  @Test public void should_parse_file_system_path() {
+    DirectoryPath path = DirectoryPath.parse("/test/src", project);
+    assertThat(path.value(), equalTo("/test/src"));
+    assertFalse(path.isWorkspacePath());
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/ProjectVariable_useProjectVariable_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/paths/core/ProjectVariable_replaceProjectNameWithProjectVariable_Test.java
similarity index 62%
rename from com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/ProjectVariable_useProjectVariable_Test.java
rename to com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/paths/core/ProjectVariable_replaceProjectNameWithProjectVariable_Test.java
index df5ce9e..88527f5 100644
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/ProjectVariable_useProjectVariable_Test.java
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/paths/core/ProjectVariable_replaceProjectNameWithProjectVariable_Test.java
@@ -6,7 +6,7 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.preferences.pages.paths;
+package com.google.eclipse.protobuf.ui.preferences.paths.core;
 
 import static org.hamcrest.core.IsEqual.equalTo;
 import static org.junit.Assert.assertThat;
@@ -17,11 +17,11 @@
 import org.junit.*;
 
 /**
- * Tests for <code>{@link ProjectVariable#useProjectVariable(IPath, IProject)}</code>.
+ * Tests for <code>{@link ProjectVariable#replaceProjectNameWithProjectVariable(IPath, IProject)}</code>.
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
-public class ProjectVariable_useProjectVariable_Test {
+public class ProjectVariable_replaceProjectNameWithProjectVariable_Test {
 
   private IProject project;
 
@@ -32,21 +32,21 @@
   @Test public void should_use_variable_if_path_contains_project_name() {
     IPath path = new Path("/test/src/test");
     when(project.getName()).thenReturn("test");
-    IPath newPath = ProjectVariable.useProjectVariable(path, project);
-    assertThat(newPath.toString(), equalTo("/${project}/src/test"));
+    IPath newPath = ProjectVariable.replaceProjectNameWithProjectVariable(path, project);
+    assertThat(newPath.toOSString(), equalTo("/${project}/src/test"));
   }
 
   @Test public void should_not_use_variable_if_path_does_not_contain_project_name() {
     IPath path = new Path("/main/src/test");
     when(project.getName()).thenReturn("test");
-    IPath newPath = ProjectVariable.useProjectVariable(path, project);
-    assertThat(newPath.toString(), equalTo("/main/src/test"));
+    IPath newPath = ProjectVariable.replaceProjectNameWithProjectVariable(path, project);
+    assertThat(newPath.toOSString(), equalTo("/main/src/test"));
   }
 
   @Test public void should_not_use_variable_if_path_already_contains_it() {
     IPath path = new Path("/${project}/src/test");
     when(project.getName()).thenReturn("test");
-    IPath newPath = ProjectVariable.useProjectVariable(path, project);
-    assertThat(newPath.toString(), equalTo("/${project}/src/test"));
+    IPath newPath = ProjectVariable.replaceProjectNameWithProjectVariable(path, project);
+    assertThat(newPath.toOSString(), equalTo("/${project}/src/test"));
   }
 }
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/paths/core/ProjectVariable_replaceProjectVariableWithProjectName_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/paths/core/ProjectVariable_replaceProjectVariableWithProjectName_Test.java
new file mode 100644
index 0000000..145d576
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/paths/core/ProjectVariable_replaceProjectVariableWithProjectName_Test.java
@@ -0,0 +1,52 @@
+/*
+ * 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.core;
+
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.*;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.*;
+import org.junit.*;
+
+/**
+ * Tests for <code>{@link ProjectVariable#replaceProjectVariableWithProjectName(IPath, IProject)}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class ProjectVariable_replaceProjectVariableWithProjectName_Test {
+
+  private IProject project;
+
+  @Before public void setUp() {
+    project = mock(IProject.class);
+  }
+
+  @Test public void should_use_project_name_if_path_contains_variable() {
+    when(project.getName()).thenReturn("test");
+    IPath path = new Path("/${project}/src/test");
+    IPath newPath = ProjectVariable.replaceProjectVariableWithProjectName(path, project);
+    assertThat(newPath.toOSString(), equalTo("/test/src/test"));
+  }
+
+  @Test public void should_not_use_project_name_if_path_does_not_contain_variable() {
+    when(project.getName()).thenReturn("test");
+    IPath path = new Path("/main/src/test");
+    IPath newPath = ProjectVariable.replaceProjectVariableWithProjectName(path, project);
+    assertThat(newPath.toOSString(), equalTo("/main/src/test"));
+  }
+
+  @Test public void should_not_use_project_name_if_path_already_contains_it() {
+    when(project.getName()).thenReturn("test");
+    IPath path = new Path("/test/src/test");
+    IPath newPath = ProjectVariable.replaceProjectVariableWithProjectName(path, project);
+    assertThat(newPath.toOSString(), equalTo("/test/src/test"));
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/scoping/SingleDirectoryFileResolver_resolveUri_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/scoping/SingleDirectoryFileResolver_resolveUri_Test.java
index 3de99ee..f4e29b3 100644
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/scoping/SingleDirectoryFileResolver_resolveUri_Test.java
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/scoping/SingleDirectoryFileResolver_resolveUri_Test.java
@@ -17,7 +17,7 @@
 import org.eclipse.emf.common.util.URI;
 import org.junit.*;
 
-import com.google.eclipse.protobuf.ui.preferences.pages.paths.PathsPreferences;
+import com.google.eclipse.protobuf.ui.preferences.paths.core.PathsPreferences;
 import com.google.eclipse.protobuf.ui.util.Resources;
 
 /**
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/CommaSeparatedValues_splitCsv_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/CommaSeparatedValues_splitCsv_Test.java
new file mode 100644
index 0000000..b903177
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/util/CommaSeparatedValues_splitCsv_Test.java
@@ -0,0 +1,32 @@
+/*
+ * 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.util;
+
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.junit.Assert.assertThat;
+
+import org.junit.Test;
+
+/**
+ * Tests for <code>{@link CommaSeparatedValues#splitCsv(String)}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class CommaSeparatedValues_splitCsv_Test {
+
+  @Test public void should_split_CSV() {
+    String[] values = CommaSeparatedValues.splitCsv("Yoda, Leia, Luke");
+    assertThat(values, equalTo(new String[] { "Yoda", "Leia", "Luke" }));
+  }
+
+  @Test public void should_return_same_String_if_it_is_not_CSV() {
+    String[] values = CommaSeparatedValues.splitCsv("Yoda");
+    assertThat(values, equalTo(new String[] { "Yoda" }));
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui/plugin.xml b/com.google.eclipse.protobuf.ui/plugin.xml
index ffe8025..794e98a 100644
--- a/com.google.eclipse.protobuf.ui/plugin.xml
+++ b/com.google.eclipse.protobuf.ui/plugin.xml
@@ -216,7 +216,7 @@
   </extension>
   <extension point="org.eclipse.ui.propertyPages">
     <page
-      class="com.google.eclipse.protobuf.ui.ProtobufExecutableExtensionFactory:com.google.eclipse.protobuf.ui.preferences.pages.general.GeneralPreferencePage"
+      class="com.google.eclipse.protobuf.ui.ProtobufExecutableExtensionFactory:com.google.eclipse.protobuf.ui.preferences.general.page.GeneralPreferencePage"
       id="com.google.eclipse.protobuf.Protobuf"
       name="%page.name"
       selectionFilter="single">
@@ -237,7 +237,7 @@
     </page>
     <page
       category="com.google.eclipse.protobuf.Protobuf"
-      class="com.google.eclipse.protobuf.ui.ProtobufExecutableExtensionFactory:com.google.eclipse.protobuf.ui.preferences.pages.paths.PathsPreferencePage"
+      class="com.google.eclipse.protobuf.ui.ProtobufExecutableExtensionFactory:com.google.eclipse.protobuf.ui.preferences.paths.page.PathsPreferencePage"
       id="com.google.eclipse.protobuf.ui.properties.paths.PropertyPage"
       name="%page.name.3"
       selectionFilter="single">
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java
index 7de4f38..9b8d95f 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java
@@ -41,7 +41,7 @@
 import com.google.eclipse.protobuf.ui.preferences.editor.numerictag.core.NumericTagPreferenceStoreInitializer;
 import com.google.eclipse.protobuf.ui.preferences.editor.save.core.SaveActionsPreferenceStoreInitializer;
 import com.google.eclipse.protobuf.ui.preferences.general.core.GeneralPreferenceStoreInitializer;
-import com.google.eclipse.protobuf.ui.preferences.pages.paths.PathsPreferenceStoreInitializer;
+import com.google.eclipse.protobuf.ui.preferences.paths.core.PathsPreferenceStoreInitializer;
 import com.google.eclipse.protobuf.ui.quickfix.ProtobufQuickAssistProcessor;
 import com.google.eclipse.protobuf.ui.scoping.FileUriResolver;
 import com.google.eclipse.protobuf.ui.validation.*;
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/protoc/ProtobufBuildParticipant.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/protoc/ProtobufBuildParticipant.java
index 0c8e355..5b4a7c2 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/protoc/ProtobufBuildParticipant.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/protoc/ProtobufBuildParticipant.java
@@ -10,7 +10,7 @@
 
 import static com.google.eclipse.protobuf.ui.exception.CoreExceptions.error;
 import static com.google.eclipse.protobuf.ui.preferences.compiler.core.CompilerPreferences.compilerPreferences;
-import static com.google.eclipse.protobuf.ui.preferences.pages.paths.PathResolutionType.MULTIPLE_DIRECTORIES;
+import static com.google.eclipse.protobuf.ui.util.CommaSeparatedValues.splitCsv;
 import static com.google.eclipse.protobuf.util.Closeables.closeQuietly;
 import static java.util.Collections.*;
 import static org.eclipse.core.resources.IResource.DEPTH_INFINITE;
@@ -27,7 +27,7 @@
 import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
 
 import com.google.eclipse.protobuf.ui.preferences.compiler.core.CompilerPreferences;
-import com.google.eclipse.protobuf.ui.preferences.pages.paths.*;
+import com.google.eclipse.protobuf.ui.preferences.paths.core.*;
 import com.google.inject.Inject;
 
 /**
@@ -37,11 +37,10 @@
  */
 public class ProtobufBuildParticipant implements IXtextBuilderParticipant {
 
-  @Inject private IPreferenceStoreAccess storeAccess;
-  @Inject private PathsPreferencesFactory pathsPreferencesFactory;
   @Inject private ProtocCommandFactory commandFactory;
   @Inject private ProtocOutputParser outputParser;
   @Inject private ProtoDescriptorPathFinder protoDescriptorPathFinder;
+  @Inject private IPreferenceStoreAccess storeAccess;
 
   @Override public void build(IBuildContext context, IProgressMonitor monitor) throws CoreException {
     IProject project = context.getBuiltProject();
@@ -78,11 +77,12 @@
 
   private List<String> importRoots(IProject project) {
     List<String> paths = new ArrayList<String>();
-    PathsPreferences preferences = pathsPreferencesFactory.preferences(project);
-    if (MULTIPLE_DIRECTORIES.equals(preferences.pathResolutionType())) {
-      List<DirectoryPath> directoryPaths = preferences.importRoots();
-      for (DirectoryPath path : directoryPaths) {
-        String location = path.location(project);
+    PathsPreferences preferences = new PathsPreferences(storeAccess, project);
+    if (preferences.filesInMultipleDirectories().getValue()) {
+      String directoryPaths = preferences.directoryPaths().getValue();
+      for (String importRoot : splitCsv(directoryPaths)) {
+        DirectoryPath path = DirectoryPath.parse(importRoot, project);
+        String location = path.absolutePathInFileSystem();
         if (location != null) {
           paths.add(location);
         }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/page/CompilerPreferencePage.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/page/CompilerPreferencePage.java
index c543462..ce934d2 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/page/CompilerPreferencePage.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/page/CompilerPreferencePage.java
@@ -359,6 +359,10 @@
   }
 
   private void checkState() {
+    if (isPropertyPage() && !areProjectSettingsActive()) {
+      pageIsNowValid();
+      return;
+    }
     if (!atLeastOneTargetLanguageIsSelected()) {
       pageIsNowInvalid(errorNoLanguageSelected);
       return;
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/PreferenceAndPropertyPage.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/PreferenceAndPropertyPage.java
index 9705c99..27e7736 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/PreferenceAndPropertyPage.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/PreferenceAndPropertyPage.java
@@ -36,9 +36,7 @@
  */
 public abstract class PreferenceAndPropertyPage extends PreferencePage implements IWorkbenchPreferencePage,
     IWorkbenchPropertyPage {
-
   private Button btnEnableProjectSettings;
-
   private Link lnkEnableWorkspaceSettings;
 
   private IProject project;
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/binding/Binding.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/binding/Binding.java
index d9c662c..ed7e68a 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/binding/Binding.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/binding/Binding.java
@@ -18,17 +18,17 @@
 public interface Binding {
 
   /**
-   * Reads a preference value and applies it to this binding's target object.
+   * Reads a preference value and applies it to the target object.
    */
   void applyPreferenceValueToTarget();
 
   /**
-   * Reads a default value preference and applies it to the this binding's target object.
+   * Reads a default value preference and applies it to the the target object.
    */
   void applyDefaultPreferenceValueToTarget();
 
   /**
-   * Applies the value of this binding's target object to a preference.
+   * Saves the value of the target object to a preference.
    */
   void savePreferenceValue();
 }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/DirectoryPath.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/DirectoryPath.java
deleted file mode 100644
index 9da8ec1..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/DirectoryPath.java
+++ /dev/null
@@ -1,103 +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.ui.preferences.pages.paths;
-
-import static com.google.eclipse.protobuf.ui.preferences.pages.paths.ProjectVariable.useProjectName;
-import static java.util.regex.Pattern.compile;
-
-import java.util.regex.*;
-
-import org.eclipse.core.filesystem.*;
-import org.eclipse.core.resources.*;
-import org.eclipse.core.runtime.Path;
-
-/**
- * Represents the path of a directory.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class DirectoryPath {
-
-  private static final Pattern WORKSPACE_PATH_PATTERN = compile("\\$\\{workspace_loc:(.*)\\}");
-
-  private final String value;
-  private final boolean isWorkspacePath;
-
-  static DirectoryPath parse(String path) {
-    return parse(path, null);
-  }
-
-  static DirectoryPath parse(String path, IProject project) {
-    Matcher matcher = WORKSPACE_PATH_PATTERN.matcher(path);
-    if (matcher.matches()) {
-      String actualPath = matcher.group(1);
-      if (project != null) {
-        actualPath = useProjectName(actualPath, project);
-      }
-      return new DirectoryPath(actualPath, true);
-    }
-    return new DirectoryPath(path, false);
-  }
-
-  DirectoryPath(String path, boolean isWorkspacePath) {
-    this.value = path;
-    this.isWorkspacePath = isWorkspacePath;
-  }
-
-  /** {@inheritDoc} */
-  @Override public String toString() {
-    if (!isWorkspacePath) {
-      return value;
-    }
-    return "${workspace_loc:" + value + "}";
-  }
-
-  /**
-   * Returns the textual value of this path.
-   * @return the textual value of this path.
-   */
-  public String value() {
-    return value;
-  }
-
-  /**
-   * Indicates whether this path belongs to a workspace resource.
-   * @return {@code true} if this path belongs to a workspace resource, {@code false} otherwise.
-   */
-  public boolean isWorkspacePath() {
-    return isWorkspacePath;
-  }
-
-  /**
-   * Returns the absolute path in the local file system, or {@code null} if no path can be determined.
-   * @param project used if this path belongs to a workspace resource.
-   * @return the absolute path in the local file system, or {@code null} if no path can be determined.
-   */
-  public String location(IProject project) {
-    if (isWorkspacePath()) {
-      return locationOfWorkspaceDirectory(project);
-    }
-    return locationOfFileSystemDirectory();
-  }
-
-  private String locationOfWorkspaceDirectory(IProject project) {
-    IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-    IFolder folder = root.getFolder(new Path(value()));
-    return folder.getLocation().toOSString();
-  }
-
-  private String locationOfFileSystemDirectory() {
-    IFileSystem fileSystem = EFS.getLocalFileSystem();
-    IFileInfo fileInfo = fileSystem.getStore(new Path(value())).fetchInfo();
-    if (!fileInfo.isDirectory()) {
-      return null;
-    }
-    return value();
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/PathResolutionType.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/PathResolutionType.java
deleted file mode 100644
index 29fbfa6..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/PathResolutionType.java
+++ /dev/null
@@ -1,20 +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.ui.preferences.pages.paths;
-
-/**
- * Types of file resolution.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public enum PathResolutionType {
-
-  SINGLE_DIRECTORY, MULTIPLE_DIRECTORIES;
-
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/PathsPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/PathsPreferences.java
deleted file mode 100644
index bb2b556..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/PathsPreferences.java
+++ /dev/null
@@ -1,55 +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.ui.preferences.pages.paths;
-
-import static com.google.eclipse.protobuf.ui.preferences.pages.paths.PathResolutionType.*;
-import static java.util.Collections.*;
-
-import java.util.*;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * Paths preferences, retrieved from an <code>{@link IPreferenceStore}</code>.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class PathsPreferences {
-
-  private final PathResolutionType pathResolutionType;
-  private final List<DirectoryPath> importRoots;
-
-  private static final String CSV_PATTERN = "[\\s]*,[\\s]*";
-
-  PathsPreferences(RawPreferences preferences, IProject project) {
-    boolean filesInOneDirectoryOnly = preferences.filesInOneDirectoryOnly().getValue();
-    pathResolutionType = filesInOneDirectoryOnly ? SINGLE_DIRECTORY : MULTIPLE_DIRECTORIES;
-    importRoots = importRoots(preferences, project);
-  }
-
-  private List<DirectoryPath> importRoots(RawPreferences preferences, IProject project) {
-    if (pathResolutionType.equals(SINGLE_DIRECTORY)) {
-      return emptyList();
-    }
-    List<DirectoryPath> roots = new ArrayList<DirectoryPath>();
-    for (String root : preferences.directoryPaths().getValue().split(CSV_PATTERN)) {
-      roots.add(DirectoryPath.parse(root, project));
-    }
-    return unmodifiableList(roots);
-  }
-
-  public PathResolutionType pathResolutionType() {
-    return pathResolutionType;
-  }
-
-  public List<DirectoryPath> importRoots() {
-    return importRoots;
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/PathsPreferencesFactory.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/PathsPreferencesFactory.java
deleted file mode 100644
index f5f3009..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/PathsPreferencesFactory.java
+++ /dev/null
@@ -1,30 +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.ui.preferences.pages.paths;
-
-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;
-
-/**
- * Factory of <code>{@link PathsPreferences}</code>.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class PathsPreferencesFactory {
-
-  @Inject private IPreferenceStoreAccess storeAccess;
-
-  public PathsPreferences preferences(IProject project) {
-    IPreferenceStore store = storeAccess.getWritablePreferenceStore(project);
-    return new PathsPreferences(new RawPreferences(store), project);
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/RawPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/RawPreferences.java
deleted file mode 100644
index c1f77f7..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/RawPreferences.java
+++ /dev/null
@@ -1,41 +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.ui.preferences.pages.paths;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-
-import com.google.eclipse.protobuf.ui.preferences.*;
-
-/**
- * @author alruiz@google.com (Alex Ruiz)
- */
-class RawPreferences {
-
-  private final BooleanPreference filesInOneDirectoryOnly;
-  private final BooleanPreference filesInMultipleDirectories;
-  private final StringPreference directoryPaths;
-
-  RawPreferences(IPreferenceStore store) {
-    filesInOneDirectoryOnly = new BooleanPreference("paths.filesInOneDirectoryOnly", store);
-    filesInMultipleDirectories = new BooleanPreference("paths.filesInMultipleDirectories", store);
-    directoryPaths = new StringPreference("paths.directoryPaths", store);
-  }
-
-  BooleanPreference filesInOneDirectoryOnly() {
-    return filesInOneDirectoryOnly;
-  }
-
-  BooleanPreference filesInMultipleDirectories() {
-    return filesInMultipleDirectories;
-  }
-
-  StringPreference directoryPaths() {
-    return directoryPaths;
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/core/DirectoryPath.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/core/DirectoryPath.java
new file mode 100644
index 0000000..a49a675
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/core/DirectoryPath.java
@@ -0,0 +1,99 @@
+/*
+ * 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.core;
+
+import static com.google.eclipse.protobuf.ui.preferences.paths.core.ProjectVariable.replaceProjectVariableWithProjectName;
+
+import java.util.regex.*;
+
+import org.eclipse.core.filesystem.*;
+import org.eclipse.core.resources.*;
+import org.eclipse.core.runtime.*;
+
+/**
+ * Represents the path of a directory.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class DirectoryPath {
+  private static final Pattern WORKSPACE_PATH_PATTERN = Pattern.compile("\\$\\{workspace_loc:(.*)\\}");
+
+  private final String value;
+  private final boolean isWorkspacePath;
+
+  /**
+   * Creates a new <code>{@link DirectoryPath}</code>.
+   * @param path the path to parse. If the path belongs to a file in the workspace it should match the pattern
+   * "\$\{workspace_loc:(.*)\}".
+   * @param project the current project.
+   * @return the created {@code DirectoryPath}.
+   */
+  public static DirectoryPath parse(String path, IProject project) {
+    Matcher matcher = WORKSPACE_PATH_PATTERN.matcher(path);
+    String actualPath = path;
+    boolean isWorkspacePath = false;
+    if (matcher.matches()) {
+      actualPath = matcher.group(1);
+      isWorkspacePath = true;
+      if (project != null) {
+        IPath newPath = replaceProjectVariableWithProjectName(new Path(actualPath), project);
+        actualPath = newPath.toOSString();
+      }
+    }
+    return new DirectoryPath(actualPath, isWorkspacePath);
+  }
+
+  private DirectoryPath(String path, boolean isWorkspacePath) {
+    this.value = path;
+    this.isWorkspacePath = isWorkspacePath;
+  }
+
+  /**
+   * Returns the textual value of this path.
+   * @return the textual value of this path.
+   */
+  public String value() {
+    return value;
+  }
+
+  /**
+   * Indicates whether this path belongs to a workspace resource.
+   * @return {@code true} if this path belongs to a workspace resource, {@code false} otherwise.
+   */
+  public boolean isWorkspacePath() {
+    return isWorkspacePath;
+  }
+
+  /**
+   * Returns the absolute path in the local file system, or {@code null} if no path can be determined.
+   * @return the absolute path in the local file system, or {@code null} if no path can be determined.
+   */
+  public String absolutePathInFileSystem() {
+    Path path = new Path(value);
+    if (isWorkspacePath()) {
+      return locationOfWorkspaceDirectory(path);
+    }
+    return locationOfFileSystemDirectory(path);
+  }
+
+  private String locationOfWorkspaceDirectory(Path path) {
+    IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+    IFolder directory = root.getFolder(path);
+    return directory.getLocation().toOSString();
+  }
+
+  private String locationOfFileSystemDirectory(Path path) {
+    IFileSystem fileSystem = EFS.getLocalFileSystem();
+    IFileInfo fileInfo = fileSystem.getStore(path).fetchInfo();
+    if (!fileInfo.isDirectory()) {
+      return null;
+    }
+    return value;
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/PathsPreferenceStoreInitializer.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/core/PathsPreferenceStoreInitializer.java
similarity index 87%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/PathsPreferenceStoreInitializer.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/core/PathsPreferenceStoreInitializer.java
index 3ffa066..8474eda 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/PathsPreferenceStoreInitializer.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/core/PathsPreferenceStoreInitializer.java
@@ -6,7 +6,7 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.preferences.pages.paths;
+package com.google.eclipse.protobuf.ui.preferences.paths.core;
 
 import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.xtext.ui.editor.preferences.*;
@@ -21,7 +21,7 @@
   /** {@inheritDoc} */
   @Override public void initialize(IPreferenceStoreAccess access) {
     IPreferenceStore store = access.getWritablePreferenceStore();
-    RawPreferences preferences = new RawPreferences(store);
+    PathsPreferences preferences = new PathsPreferences(store);
     preferences.filesInOneDirectoryOnly().setDefaultValue(true);
     preferences.filesInMultipleDirectories().setDefaultValue(false);
     preferences.directoryPaths().setDefaultValue("");
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/core/PathsPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/core/PathsPreferences.java
index 1e4fa56..e197f18 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/core/PathsPreferences.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/core/PathsPreferences.java
@@ -8,7 +8,9 @@
  */
 package com.google.eclipse.protobuf.ui.preferences.paths.core;
 
+import org.eclipse.core.resources.IProject;
 import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
 
 import com.google.eclipse.protobuf.ui.preferences.*;
 import com.google.eclipse.protobuf.ui.preferences.editor.save.core.SaveActionsPreferences;
@@ -19,16 +21,35 @@
  * @author alruiz@google.com (Alex Ruiz)
  */
 public class PathsPreferences {
-
   private final BooleanPreference filesInOneDirectoryOnly;
   private final BooleanPreference filesInMultipleDirectories;
   private final StringPreference directoryPaths;
+  private final IProject project;
+
+  /**
+   * Creates a new <code>{@link PathsPreferences}</code>.
+   * @param storeAccess simplified access to Eclipse's preferences.
+   * @param project the current project.
+   */
+  public PathsPreferences(IPreferenceStoreAccess storeAccess, IProject project) {
+    this(storeAccess.getWritablePreferenceStore(project), project);
+  }
 
   /**
    * Creates a new <code>{@link SaveActionsPreferences}</code>.
    * @param store a table mapping named preferences to values.
    */
   public PathsPreferences(IPreferenceStore store) {
+    this(store, null);
+  }
+
+  /**
+   * Creates a new <code>{@link SaveActionsPreferences}</code>.
+   * @param store a table mapping named preferences to values.
+   * @param project the current project.
+   */
+  public PathsPreferences(IPreferenceStore store, IProject project) {
+    this.project = project;
     filesInOneDirectoryOnly = new BooleanPreference("paths.filesInOneDirectoryOnly", store);
     filesInMultipleDirectories = new BooleanPreference("paths.filesInMultipleDirectories", store);
     directoryPaths = new StringPreference("paths.directoryPaths", store);
@@ -59,4 +80,12 @@
   public StringPreference directoryPaths() {
     return directoryPaths;
   }
+
+  /**
+   * Returns the current project.
+   * @return the current project.
+   */
+  public IProject getProject() {
+    return project;
+  }
 }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/ProjectVariable.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/core/ProjectVariable.java
similarity index 73%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/ProjectVariable.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/core/ProjectVariable.java
index 10b4895..db922d9 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/ProjectVariable.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/core/ProjectVariable.java
@@ -6,7 +6,7 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.preferences.pages.paths;
+package com.google.eclipse.protobuf.ui.preferences.paths.core;
 
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.*;
@@ -16,17 +16,16 @@
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
-class ProjectVariable {
+public class ProjectVariable {
 
   private static final String VARIABLE_VALUE = "${project}";
 
-  static IPath useProjectVariable(IPath path, IProject project) {
+  public static IPath replaceProjectNameWithProjectVariable(IPath path, IProject project) {
     return switchProjectSegments(path, project.getName(), VARIABLE_VALUE);
   }
 
-  static String useProjectName(String path, IProject project) {
-    IPath newPath = switchProjectSegments(new Path(path), VARIABLE_VALUE, project.getName());
-    return newPath.toString();
+  public static IPath replaceProjectVariableWithProjectName(IPath path, IProject project) {
+    return switchProjectSegments(path, VARIABLE_VALUE, project.getName());
   }
 
   private static IPath switchProjectSegments(IPath path, String currentSegment, String newSegment) {
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/AddDirectoryDialog.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/page/AddDirectoryDialog.java
similarity index 87%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/AddDirectoryDialog.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/page/AddDirectoryDialog.java
index b60de32..c6d8845 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/AddDirectoryDialog.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/page/AddDirectoryDialog.java
@@ -6,12 +6,11 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.preferences.pages.paths;
+package com.google.eclipse.protobuf.ui.preferences.paths.page;
 
 import static com.google.eclipse.protobuf.ui.preferences.pages.TextWidgets.setEditable;
-import static com.google.eclipse.protobuf.ui.preferences.pages.paths.DirectorySelectionDialogs.*;
-import static com.google.eclipse.protobuf.ui.preferences.pages.paths.Messages.*;
-import static com.google.eclipse.protobuf.ui.preferences.pages.paths.ProjectVariable.useProjectVariable;
+import static com.google.eclipse.protobuf.ui.preferences.paths.page.DirectorySelectionDialogs.*;
+import static com.google.eclipse.protobuf.ui.preferences.paths.page.Messages.*;
 import static org.eclipse.jface.dialogs.IDialogConstants.OK_ID;
 import static org.eclipse.xtext.util.Strings.isEmpty;
 
@@ -23,6 +22,7 @@
 import org.eclipse.swt.widgets.*;
 
 import com.google.eclipse.protobuf.ui.preferences.pages.InputDialog;
+import com.google.eclipse.protobuf.ui.preferences.paths.core.ProjectVariable;
 
 /**
  * Dialog where users can select a path (in the workspace or file system) to be included in resolution of imports.
@@ -30,10 +30,11 @@
  * @author alruiz@google.com (Alex Ruiz)
  */
 public class AddDirectoryDialog extends InputDialog {
+  private static final String DIRECTORY_PATH_FORMAT = "${workspace_loc:%s}";
 
   private final IProject project;
 
-  private DirectoryPath selectedPath;
+  private String selectedPath;
 
   private Text txtPath;
   private Button btnWorkspace;
@@ -100,7 +101,7 @@
       @Override public void widgetSelected(SelectionEvent e) {
         IPath path = showWorkspaceDirectorySelectionDialog(getShell(), enteredPathText());
         if (path != null) {
-          path = useProjectVariable(path, project);
+          path = ProjectVariable.replaceProjectNameWithProjectVariable(path, project);
           txtPath.setText(path.toString().trim());
           btnIsWorkspacePath.setSelection(true);
         }
@@ -132,7 +133,10 @@
 
   /** {@inheritDoc} */
   @Override protected void okPressed() {
-    selectedPath = new DirectoryPath(enteredPathText(), btnIsWorkspacePath.getSelection());
+    selectedPath = enteredPathText();
+    if (btnIsWorkspacePath.getSelection()) {
+      selectedPath = String.format(DIRECTORY_PATH_FORMAT, selectedPath);
+    }
     super.okPressed();
   }
 
@@ -144,7 +148,7 @@
    * Returns the path selected by the user.
    * @return the path selected by the user.
    */
-  public DirectoryPath selectedPath() {
+  public String selectedPath() {
     return selectedPath;
   }
 }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/DirectoryPathsEditor.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/page/DirectoryPathsEditor.java
similarity index 93%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/DirectoryPathsEditor.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/page/DirectoryPathsEditor.java
index f263259..8b4ad84 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/DirectoryPathsEditor.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/page/DirectoryPathsEditor.java
@@ -6,9 +6,9 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.preferences.pages.paths;
+package com.google.eclipse.protobuf.ui.preferences.paths.page;
 
-import static com.google.eclipse.protobuf.ui.preferences.pages.paths.Messages.*;
+import static com.google.eclipse.protobuf.ui.preferences.paths.page.Messages.*;
 import static java.util.Collections.unmodifiableList;
 import static org.eclipse.jface.window.Window.OK;
 
@@ -25,6 +25,7 @@
 import org.eclipse.xtext.ui.PluginImageHelper;
 
 import com.google.eclipse.protobuf.ui.preferences.pages.DataChangedListener;
+import com.google.eclipse.protobuf.ui.preferences.paths.core.DirectoryPath;
 
 /**
  * Editor where users can add/remove the directories to be used for URI resolution.
@@ -42,7 +43,7 @@
   private final Button btnUp;
   private final Button btnDown;
 
-  private final LinkedList<DirectoryPath> importPaths = new LinkedList<DirectoryPath>();
+  private final LinkedList<String> importPaths = new LinkedList<String>();
 
   private DataChangedListener dataChangedListener;
 
@@ -69,7 +70,7 @@
     tblclmnPath.setText(directories);
     tblclmnVwrPath.setLabelProvider(new ColumnLabelProvider() {
       @Override public String getText(Object element) {
-        return ((DirectoryPath) element).toString();
+        return element.toString();
       }
     });
 
@@ -149,7 +150,7 @@
     }
     int target = goUp ? index - 1 : index + 1;
     int[] selection = tblDirectoryPaths.getSelectionIndices();
-    DirectoryPath path = importPaths.get(selection[0]);
+    String path = importPaths.get(selection[0]);
     importPaths.remove(index);
     importPaths.add(target, path);
     updateTable();
@@ -181,11 +182,11 @@
     btnDown.setEnabled(hasElements && hasSelection && selectionIndex < size - 1);
   }
 
-  public List<DirectoryPath> directoryPaths() {
+  public List<String> directoryPaths() {
     return unmodifiableList(importPaths);
   }
 
-  public void directoryPaths(Collection<DirectoryPath> paths) {
+  public void directoryPaths(Collection<String> paths) {
     importPaths.clear();
     importPaths.addAll(paths);
     updateTable();
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/DirectorySelectionDialogs.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/page/DirectorySelectionDialogs.java
similarity index 95%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/DirectorySelectionDialogs.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/page/DirectorySelectionDialogs.java
index c54435b..d9ec921 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/DirectorySelectionDialogs.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/page/DirectorySelectionDialogs.java
@@ -6,10 +6,10 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.preferences.pages.paths;
+package com.google.eclipse.protobuf.ui.preferences.paths.page;
 
 import static com.google.eclipse.protobuf.ui.ProtobufUiModule.PLUGIN_ID;
-import static com.google.eclipse.protobuf.ui.preferences.pages.paths.Messages.*;
+import static com.google.eclipse.protobuf.ui.preferences.paths.page.Messages.*;
 import static org.eclipse.core.runtime.IStatus.ERROR;
 import static org.eclipse.core.runtime.Status.OK_STATUS;
 import static org.eclipse.jface.window.Window.OK;
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/Messages.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/page/Messages.java
similarity index 95%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/Messages.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/page/Messages.java
index 7da1a40..f316483 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/Messages.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/page/Messages.java
@@ -6,7 +6,7 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.preferences.pages.paths;
+package com.google.eclipse.protobuf.ui.preferences.paths.page;
 
 import org.eclipse.osgi.util.NLS;
 
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/Messages.properties b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/page/Messages.properties
similarity index 100%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/Messages.properties
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/page/Messages.properties
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/PathsPreferencePage.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/page/PathsPreferencePage.java
similarity index 86%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/PathsPreferencePage.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/page/PathsPreferencePage.java
index 37d9954..acfb64c 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/PathsPreferencePage.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/page/PathsPreferencePage.java
@@ -6,12 +6,12 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.preferences.pages.paths;
+package com.google.eclipse.protobuf.ui.preferences.paths.page;
 
 import static com.google.eclipse.protobuf.ui.ProtobufUiModule.PLUGIN_ID;
 import static com.google.eclipse.protobuf.ui.preferences.pages.ButtonGroup.with;
 import static com.google.eclipse.protobuf.ui.preferences.pages.binding.BindingToButtonSelection.bindSelectionOf;
-import static com.google.eclipse.protobuf.ui.preferences.pages.paths.Messages.*;
+import static com.google.eclipse.protobuf.ui.preferences.paths.page.Messages.*;
 import static java.util.Collections.unmodifiableList;
 import static org.eclipse.core.resources.IncrementalProjectBuilder.FULL_BUILD;
 import static org.eclipse.core.runtime.Status.OK_STATUS;
@@ -30,9 +30,9 @@
 import org.eclipse.swt.widgets.*;
 import org.eclipse.xtext.ui.PluginImageHelper;
 
-import com.google.eclipse.protobuf.ui.preferences.*;
 import com.google.eclipse.protobuf.ui.preferences.pages.*;
 import com.google.eclipse.protobuf.ui.preferences.pages.binding.*;
+import com.google.eclipse.protobuf.ui.preferences.paths.core.PathsPreferences;
 import com.google.eclipse.protobuf.ui.validation.ValidationTrigger;
 import com.google.inject.Inject;
 
@@ -42,7 +42,6 @@
  * @author alruiz@google.com (Alex Ruiz)
  */
 public class PathsPreferencePage extends PreferenceAndPropertyPage {
-
   private static Logger logger = Logger.getLogger(PathsPreferencePage.class);
 
   private static final String COMMA_DELIMITER = ",";
@@ -116,45 +115,42 @@
   }
 
   @Override protected void setupBinding(PreferenceBinder preferenceBinder) {
-    RawPreferences preferences = new RawPreferences(getPreferenceStore());
-    preferenceBinder.addAll(bindSelectionOf(btnOneDirectoryOnly).to(preferences.filesInOneDirectoryOnly()),
-        bindSelectionOf(btnMultipleDirectories).to(preferences.filesInMultipleDirectories()));
-    final StringPreference directoryPaths = preferences.directoryPaths();
+    final PathsPreferences preferences = new PathsPreferences(getPreferenceStore());
+    preferenceBinder.addAll(
+        bindSelectionOf(btnOneDirectoryOnly).to(preferences.filesInOneDirectoryOnly()),
+        bindSelectionOf(btnMultipleDirectories).to(preferences.filesInMultipleDirectories())
+      );
     preferenceBinder.add(new Binding() {
       @Override public void applyPreferenceValueToTarget() {
-        setDirectoryPaths(directoryPaths.getValue());
+        setDirectoryPaths(preferences.directoryPaths().getValue());
       }
 
       @Override public void applyDefaultPreferenceValueToTarget() {
-        setDirectoryPaths(directoryPaths.getDefaultValue());
+        setDirectoryPaths(preferences.directoryPaths().getDefaultValue());
       }
 
       @Override public void savePreferenceValue() {
-        directoryPaths.setValue(directoryNames());
+        preferences.directoryPaths().setValue(directoryNames());
       }
     });
   }
 
   private String directoryNames() {
-    List<DirectoryPath> paths = directoryPathsEditor.directoryPaths();
+    List<String> paths = directoryPathsEditor.directoryPaths();
     if (paths.isEmpty())
      {
       return "";
     }
-    List<String> pathsAsText = new ArrayList<String>();
-    for (DirectoryPath path : paths) {
-      pathsAsText.add(path.toString());
-    }
-    return concat(COMMA_DELIMITER, pathsAsText);
+    return concat(COMMA_DELIMITER, paths);
   }
 
   private void setDirectoryPaths(String directoryPaths) {
-    List<DirectoryPath> paths = new ArrayList<DirectoryPath>();
+    List<String> paths = new ArrayList<String>();
     for (String path : split(directoryPaths, COMMA_DELIMITER)) {
       if (isEmpty(path)) {
         continue;
       }
-      paths.add(DirectoryPath.parse(path));
+      paths.add(path);
     }
     directoryPathsEditor.directoryPaths(unmodifiableList(paths));
   }
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 15ed6e9..32c088a 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
@@ -8,28 +8,27 @@
  */
 package com.google.eclipse.protobuf.ui.scoping;
 
-import static com.google.eclipse.protobuf.ui.preferences.pages.paths.PathResolutionType.*;
-
-import java.util.*;
-
-import com.google.eclipse.protobuf.ui.preferences.pages.paths.PathResolutionType;
 import com.google.eclipse.protobuf.ui.util.Resources;
-import com.google.inject.*;
+import com.google.inject.Inject;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
  */
-@Singleton class FileResolverStrategies {
+class FileResolverStrategies {
 
-  private final Map<PathResolutionType, FileResolverStrategy> strategies =
-      new HashMap<PathResolutionType, FileResolverStrategy>();
+  private final FileResolverStrategy singleDirectory;
+  private final FileResolverStrategy multipleDirectories;
 
   @Inject FileResolverStrategies(PathMapping mapping, Resources resources) {
-    strategies.put(SINGLE_DIRECTORY, new SingleDirectoryFileResolver(resources));
-    strategies.put(MULTIPLE_DIRECTORIES, new MultipleDirectoriesFileResolver(mapping, resources));
+    singleDirectory = new SingleDirectoryFileResolver(resources);
+    multipleDirectories = new MultipleDirectoriesFileResolver(mapping, resources);
   }
 
-  FileResolverStrategy strategyFor(PathResolutionType type) {
-    return strategies.get(type);
+  FileResolverStrategy singleDirectory() {
+    return singleDirectory;
+  }
+
+  FileResolverStrategy multipleDirectories() {
+    return multipleDirectories;
   }
 }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategy.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategy.java
index 9310ccd..b639d3e 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategy.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategy.java
@@ -11,7 +11,7 @@
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.emf.common.util.URI;
 
-import com.google.eclipse.protobuf.ui.preferences.pages.paths.PathsPreferences;
+import com.google.eclipse.protobuf.ui.preferences.paths.core.PathsPreferences;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
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 a8de8d1..2e0e03d 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
@@ -13,9 +13,10 @@
 import org.eclipse.core.resources.IProject;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
 
 import com.google.eclipse.protobuf.scoping.*;
-import com.google.eclipse.protobuf.ui.preferences.pages.paths.*;
+import com.google.eclipse.protobuf.ui.preferences.paths.core.PathsPreferences;
 import com.google.eclipse.protobuf.ui.util.Resources;
 import com.google.inject.Inject;
 
@@ -26,10 +27,10 @@
  */
 public class FileUriResolver implements IFileUriResolver {
 
-  @Inject private PathsPreferencesFactory preferencesFactory;
-  @Inject private FileResolverStrategies resolvers;
   @Inject private ProtoDescriptorProvider descriptorProvider;
   @Inject private Resources resources;
+  @Inject private IPreferenceStoreAccess storeAccess;
+  @Inject private FileResolverStrategies resolvers;
 
   /*
    * The import URI is relative to the file where the import is. Protoc works fine, but the editor doesn't.
@@ -71,11 +72,14 @@
     if (project == null) {
       throw new IllegalStateException("Unable to find current project");
     }
-    PathsPreferences preferences = preferencesFactory.preferences(project);
+    PathsPreferences preferences = new PathsPreferences(storeAccess, project);
     return resolver(preferences).resolveUri(importUri, resourceUri, preferences);
   }
 
   private FileResolverStrategy resolver(PathsPreferences preferences) {
-    return resolvers.strategyFor(preferences.pathResolutionType());
+    if (preferences.filesInOneDirectoryOnly().getValue()) {
+      return resolvers.singleDirectory();
+    }
+    return resolvers.multipleDirectories();
   }
 }
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 05bd6c8..da52eb4 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,21 +8,22 @@
  */
 package com.google.eclipse.protobuf.ui.scoping;
 
-import java.util.List;
+import static com.google.eclipse.protobuf.ui.util.CommaSeparatedValues.splitCsv;
+
+import java.util.*;
 
 import org.eclipse.core.filesystem.*;
 import org.eclipse.core.filesystem.URIUtil;
 import org.eclipse.core.runtime.*;
 import org.eclipse.emf.common.util.URI;
 
-import com.google.eclipse.protobuf.ui.preferences.pages.paths.*;
+import com.google.eclipse.protobuf.ui.preferences.paths.core.*;
 import com.google.eclipse.protobuf.ui.util.Resources;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
  */
 class MultipleDirectoriesFileResolver implements FileResolverStrategy {
-
   private final PathMapping mapping;
   private final Resources resources;
 
@@ -33,18 +34,20 @@
 
   /** {@inheritDoc} */
   @Override public String resolveUri(String importUri, URI declaringResourceUri, PathsPreferences preferences) {
-    List<DirectoryPath> importRoots = preferences.importRoots();
-    for (DirectoryPath root : importRoots) {
-      String resolved = resolveUri(importUri, root);
+    String directoryPaths = preferences.directoryPaths().getValue();
+    List<String> fileSystemDirectories = new ArrayList<String>();
+    for (String importRoot : splitCsv(directoryPaths)) {
+      DirectoryPath path = DirectoryPath.parse(importRoot, preferences.getProject());
+      String resolved = resolveUri(importUri, path);
       if (resolved != null) {
         return resolved;
       }
-    }
-    for (DirectoryPath root : importRoots) {
-      if (!root.isWorkspacePath()) {
-        continue;
+      if (!path.isWorkspacePath()) {
+        fileSystemDirectories.add(path.value());
       }
-      String resolved = resolveUriInFileSystem(importUri, mapping.folderLocation(root.value()));
+    }
+    for (String root : fileSystemDirectories) {
+      String resolved = resolveUriInFileSystem(importUri, mapping.folderLocation(root));
       if (resolved != null) {
         return resolved;
       }
@@ -52,23 +55,23 @@
     return null;
   }
 
-  private String resolveUri(String importUri, DirectoryPath importRoot) {
-    String root = importRoot.value();
-    if (importRoot.isWorkspacePath()) {
+  private String resolveUri(String importUri, DirectoryPath importRootPath) {
+    String root = importRootPath.value();
+    if (importRootPath.isWorkspacePath()) {
       return resolveUriInWorkspace(importUri, root);
     }
     return resolveUriInFileSystem(importUri, root);
   }
 
-  private String resolveUriInWorkspace(String importUri, String importRoot) {
-    String path = PLATFORM_RESOURCE_PREFIX + importRoot + SEPARATOR + importUri;
+  private String resolveUriInWorkspace(String importUri, String importRootPath) {
+    String path = PLATFORM_RESOURCE_PREFIX + importRootPath + SEPARATOR + importUri;
     boolean exists = resources.fileExists(URI.createURI(path));
     return (exists) ? path : null;
   }
 
-  private String resolveUriInFileSystem(String importUri, String importRoot) {
+  private String resolveUriInFileSystem(String importUri, String importRootPath) {
     IFileSystem fileSystem = EFS.getLocalFileSystem();
-    IPath path = new Path(importRoot + SEPARATOR + importUri);
+    IPath path = new Path(importRootPath + SEPARATOR + importUri);
     IFileInfo fileInfo = fileSystem.getStore(path).fetchInfo();
     if (!fileInfo.exists()) {
       return null;
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
index faa741a..57bf5c6 100644
--- 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
@@ -27,10 +27,10 @@
 
   private static class FolderPathMapper implements Function<String, String> {
     @Override public String apply(String workspacePath) {
-      return folder(workspacePath).getLocation().toOSString();
+      return directory(workspacePath).getLocation().toOSString();
     }
 
-    private static IFolder folder(String workspacePath) {
+    private static IFolder directory(String workspacePath) {
       IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
       return root.getFolder(new Path(workspacePath));
     }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/SingleDirectoryFileResolver.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/SingleDirectoryFileResolver.java
index d99f27c..5967b1f 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/SingleDirectoryFileResolver.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/SingleDirectoryFileResolver.java
@@ -14,7 +14,7 @@
 
 import org.eclipse.emf.common.util.URI;
 
-import com.google.eclipse.protobuf.ui.preferences.pages.paths.PathsPreferences;
+import com.google.eclipse.protobuf.ui.preferences.paths.core.PathsPreferences;
 import com.google.eclipse.protobuf.ui.util.Resources;
 
 /**
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/CommaSeparatedValues.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/CommaSeparatedValues.java
new file mode 100644
index 0000000..0a07698
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/CommaSeparatedValues.java
@@ -0,0 +1,29 @@
+/*
+ * 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.util;
+
+/**
+ * Utility methods related to comma-separated values.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public final class CommaSeparatedValues {
+  private static final String CSV_PATTERN = "[\\s]*,[\\s]*";
+
+  /**
+   * Splits the given {@code String} containing comma-separated values.
+   * @param s the given {@code String}.
+   * @return an array containing an element per value in the given {@code String}.
+   */
+  public static String[] splitCsv(String s) {
+    return s.split(CSV_PATTERN);
+  }
+
+  private CommaSeparatedValues() {}
+}
